hedefteki mevcut dosyaları değiştirmeden scp


158

Hedef dizindeki içeriği değiştirmeden tüm dizinin tamamını aynı isimdeki bir dizine nasıl kopyalarım? (bunun yerine, hedef klasörün içeriğine eklemek istiyorum)


Evet, bir kullanışlı bir programdır / yarar Şunu sahip olmadığında can sıkıcı "elinden yalnızca ..." seçeneği! Bu durumda "--noclobber"!
MikeW

Yanıtlar:


139

Kullanım rsyncve pas -uyalnızca orijinal dizinde yeni olan dosyaları güncellemek istiyorsanız, ya --ignore-existingzaten hedefte var tüm dosyaları atlamak için.

rsync -au /local/directory/ host:/remote/directory/
rsync -a --ignore-existing /local/directory/ host:/remote/directory/

(Not /kaynak tarafında: Bu olmadan rsyncyaratacak /remote/directory/directory.)


@Anthon Yorumunuzu anlamıyorum ve chandra tarafından bir cevap veya yorum görmüyorum. --ignore-existingdeğiştirmeden ekleme yapar, hangi veri kaybını görüyorsunuz?
Gilles

Maalesef, ilk örneğinize veri kaybınızın olabileceği (ve IMHO'nun istediği şey değil) olduğunu düşündüm, eklerseniz - var olan veri kaybının gerçekleşmemesi gerekiyor.
Anthon

Eğer uzaktaki sistem rsynckolayca erişilebilir değilse, bu yardımcı olmaz .... (Win32-OpenSSH gibi)
Gert van den Berg

@GertvandenBerg rsync, SSH'den daha zor olmayan Windows'a kurmak oldukça kolaydır.
Gilles

@Gilles: Doğru, ancak seçeneklerin tümü Cygwin DLL'lerini içeriyor gibi görünüyor ... (OpenSSH'nin MS portunun şu anki durumu, scp üzerinde sıkıştırmayı etkinleştirmek SCP'yi kırmaya yetecek kadar ...) (Win32 üzerinden rsync işlevselliği sağlamak -OpenSSH de önemsiz görünüyor - zamanla iyileşir umarım) (Solaris 10, üçüncü parti bir paketin --rsync-pathgerekli olduğu diğer örnektir )
Gert van den Berg

82

Yazma izniniz varsa, scp dosyaların üzerine yazacaktır.

Başka bir deyişle: Üzerindeki scpyazma izinlerini geçici olarak kaldırarak söz konusu dosyaları etkili bir şekilde atlayabilirsiniz (eğer dosya sahibiyseniz).


5
Bunun için teşekkürler. Tam olarak aradığım numaraydı.
sakarin

dosyaları geri kopyaladığınızdan emin olun * bunu yapın. Örnekscp -r user@server.com:/location/of/files/* /local/location/
Rick,

1
Bul tipi f -exec chown kökü: root {} \;
ling

1
Yaygın olmayan bir durumda, dizindeki dosyaların sadece bazılarının üzerine yazılması beklenir ("korumalı değilse") ve dosya izinleri dosyalar arasında aynı değildir, bu çözüm çalışmayabilir. Aksi takdirde, oldukça basit ve etkilidir.
sancho,

Pencerelerde bunu yapmak için tüm dosyaları seçin, sağ tıklayın -> özellikler -> salt okunur
BenJammin

12

Yalnızca yeni dosyaları tarihe göre kopyalayabilirsiniz. kullanımfind

scp  `find /data/*.gz -type f -mtime +7` USER@SERVER:/backup/

+7 ne anlama geliyor?
Francis Kim

@FrancisKim 7 gün önce değiştirilmiş demektir. Bu nedenle, bu sorgu, son 7 gün içinde değiştirilen herhangi bir * .gz dosyasını seçin
Vadim Eremeev

4
+7 aslında 7 günden daha önce olduğunu ima etmiyor mu?
Jeff H.

1
Evet, "7 günden daha önce" anlamına geliyor. Bunu kimin yendiği hakkında hiçbir fikrim yok.
Stefan Reich,

9

Hedef dosya içeriğini salt okunur hale getirebilirseniz:

find . -type f -exec chmod a-w '{}' \;

çalıştırmadan önce scp(şikayet eder ve mevcut dosyaları atlar).

Ve daha sonra bunları değiştirin ( chmod +wumask tabanlı bir değer elde etmek için). Eğer dosyalarınızın tümü umaskınıza göre yazma iznine sahip değilse, bir şekilde izinleri saklayabilmeniz için onları geri yükleyebilmeniz gerekir.

(Gilles'un cevabı, eğer yerel olarak daha yeniyse, varolan dosyaların üzerine yazar, bu şekilde değerli verilerimi kaybettim. Yanlış ve zararlı cevabın neden bu kadar çok oyu olduğunu anlamıyorum).


2
Ben alamadım: nasıl ki rsync --ignore-existingverileri kaybetmek neden?
Gilles

4
Ben hata var find: missing argument to '-exec'bu komutu kullanarak ve bunun yerine kullanmak zorunda kaldı: find . -type f -exec chmod a-w {} \;. Linux'um kötü, ymmv.
wpearse

Bu daha iyi ve daha güvenli bir cevaptır. İzni değiştirmek için doğru komut: @ wpearse'da belirtildiği gibi:find . -type f -exec chmod a-w {} \;
Amir

6

Depolamamda yalnızca SFTP olduğundan rsync, benim durumumda kullanamadığım csyncveya FUSE ile benzer bir görevim vardı . rsyncdosyanın tarihini ve saatini değiştiremedi, diğer bazı yardımcı programlar (gibi csync) bana başka hatalar gösterdi: " Saat eğriliği algılandı geçici dosya oluşturulamıyor ".

Depolama sunucusuna erişiminiz varsa - buraya bir daemon olarak kurun openssh-serverveya başlatın rsync.

Benim durumumda - bunu yapamam ve çözüm oldu: lftp . lftpsenkronizasyon için kullanımı aşağıdadır:

lftp -c "open -u login,password sftp://sft.domain.tld/; \
    mirror -c --verbose=9 -e -R -L /srs/folder /rem/folder"

/src/folder- bilgisayarımdaki klasör, /rem/folder- sftp://sft.domain.tld/rem/folder.

Man sayfalarını linkten bulabilirsiniz: http://lftp.yar.ru/lftp-man.html


6

Bir sürü dosyayı kopyalamak için, onları taramak daha hızlı olur. -K kullanarak, hedef sistemde paketten çıkarırken katranların üzerine yazılmasını da önlersiniz.

tar -c <source-dir> | ssh <name>@<host> 'tar -kxzf - -C <target-dir>' 

1
Uzaktan bağlantı yapar. Öncelikle bu kaynağın kaynağıdır, ssh bağlantısına bağlar ve uzaktaki sistemde paketini açar.
huembi

-1

scpdosyaların üzerine yazar ve bunu yapmayı durduracak bir anahtar yoktur, ancak işleri bir şekilde kopyalayabilir, scp'yi yapabilir ve ardından mevcut dosyaları geri kopyalayabilirsiniz. Örnekler:

  1. Mevcut tüm dosyaları kopyalayın

    mkdir original_files ; cp -r * original_files/
    
  2. Her şeyi scp kullanarak kopyalayın

    scp -r user@server:dir/* ./
    
  3. Orijinal dosyaları, scp'nin üzerine yazdığı herhangi bir şeyin üzerine kopyalayın:

    cp -r original_files/* ./
    

3
Bu yöntem, dosyaları uzaktan kumandadan çekip bıraktığınız yerden almaya çalışırken yardımcı olmaz. Yani bütün amaç zaman kazanmaksa.
Oliver Williams

-1

Bunu başarmanın başka bir yolu lsda hedef klasörde yapmaktır :

Uzak hedef klasörde:

ls | awk '{print "mv " $1 " ../copied_data/"}' > mv_copied_data
scp mv_copied_data user@source.server.com:/path/to/source/folder

Kaynakta:

cd /path/to/source/folder
chmod 777 mv_copied_data
./mv_copied_data

Hedefte:

scp -r user@source.server.com:/path/to/source/folder /path/to/destination/foldeer

Lütfen bunu yapma. 1. Ayrıştırma ls . 2. Herhangi bir dosya adı - >boşluk yeni satır veya başka özel karakterler içeriyorsa, cevap tehlikelidir . 3. Bir python betiğinde bir for-loop kodlayın. Çalışma zamanında bir program oluşturmak, birçok nedenden dolayı zor ve zordur (profesyonel programcılar tarafından yapıldığında bile). Bir kabuk betiği oluşturmak bile daha kötü - korkunç bir fikir.
12'de ignis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.