Scp, dizinleri yinelemeli olarak kopyalayabilir mi?


572

Şu anda sadece tek bir .tardosyayı kopyalayabiliyorum . Ancak, tekrarlı olarak dizinleri nasıl kopyalayabilirim scp?

Yanıtlar:


935

Evet, kullan -r:

scp -rp sourcedirectory user@dest:/path
  • -r özyinelemeli demektir
  • -P, orijinal dosyadaki değişiklik zamanlarını, erişim zamanlarını ve modları korur.

Not: Bu, sourcedirectoryiçeriyi oluşturur, /pathböylece dosyalar içeride olur./path/sourcedirectory


9
Ancak bunun sembolik bağları korumayacağına dikkat edin.
CpnCrunch

12
Unutmayın ki -pr(ters sırada olan seçenekler) klasörleri kopyalamayacaktır, içeriğini hedef dizine (görünüşte, seçeneklerin sırası önemlidir) kopyalayın.
pms

171

Önceki cevaplar teknik olarak doğru olsa da rsyncbunun yerine kullanmayı düşünmelisiniz . rsyncGönderme ve alma taraflarındaki verileri farklı bir mekanizma ile karşılaştırır, böylece daha önce gönderilen verileri tekrar göndermesi gerekmez.

Bir şeyi bir uzak makineye bir kereden fazla kopyalayacaksanız kullanın rsync. Aslında, rsyncher zaman kullanmak iyidir, çünkü dosya izinlerini ve sahipliğini kopyalamak ve belirli dosyaları veya dizinleri hariç tutmak gibi şeyler için daha fazla denetime sahiptir. Genel olarak:

$ rsync -av /local/dir/ server:/remote/dir/

Yerel bir dizini uzak bir dizin ile senkronize eder. İkinci kez çalıştırırsanız ve yerel dizinin içeriği değişmediyse, hiçbir veri aktarılmaz - scpher seferinde her şeyi çalıştırıp kopyalamaktan çok daha etkilidir .

Ayrıca, rsynckesintili transferlerden farklı olarak çok kolay bir şekilde kurtarmanıza olanak sağlar scp.

Son olarak, rsyncvarsayılan olarak ssh üzerinden çalışan modern sürümler scp, zaten çalışıyorsa, rsynchemen hemen bir drop-in yerine geçmelidir.


1
Katılıyorum rsyncdaha verimlidir. Şu anda yapmadığı bir şey scp, uzak ana bilgisayarlar arasında kopyalamaya izin vermektir (en azından rsync istemcisini bunlardan birinde çalıştırmadan).
Cedric Knight,

1
-av: v, ayrıntılı bir arşiv, bir arşiv ve özyinelemeli, hak sahibi tarihlerini ve bağlantılarını koruyan -rlptgoD kısayolu. Sadece özyinelemeli kullanımı istiyorsanız-r
pdem


10

Özyinelemeli Kopyalama Seçeneği '-r' (küçük harf)

scp -r

Düzenli yerel özyinelemeli kopya seçenek '-R' ile karıştırıyorum (büyük harf)

cp -R

1
Sadece cp ve scp arasındaki farkı -r ve -R ile aynı olmadığını belirtmek istedim. unix.stackexchange.com/questions/18712/…
Tarun

6

En iyi yol, SSH üzerinden rsync kullanmaktır

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

Favori seçeneklerim -Pazvessh --delete:

  • -a: arşiv modu (sembolik bağlantıları korumak da dahil olmak üzere birçok varsayılan ortak seçenek içerir)
  • -z: sıkıştır
  • -v: verbose: dosyaları göster
  • -P: İlerlemeyi dosyaları yapıldı / kalan dosyalar olarak göster
  • -e ssh: ssh protokolünde rsync yap
  • --delete: Hedefte artık kaynakta olmayan dosyaları sil

rsyncKullandığım tüm sürümleri sshvarsayılan olarak kullanır , bu nedenle -esshgerekli olması olası değildir. Uzaktaki ana bilgisayara bağlanmak için kullanılan komut seçimi, tekrarlı bir şekilde kopyalamakla gerçekten ilgilidir.
kasperd

4

Özyinelemeli kopya bayrağı aradıktan ve bu yazı sayesinde başarıyla kullandıktan sonra, sadece bir öneri göndermek istiyorum.

Durum buysa, bir dizini (tekrarlı olarak) kopyalıyorsanız. Belki de dosyalar sıkıştırılmış olarak gönderilirse transferde zaman kazanabilirsiniz.

Sonunda yaptığım şey:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

Bu yardımcı olur umarım


dosya uzantısı ya .tar.gzda dosya olmalıdır, .tgzçünkü dosya gzipped tar arşividir ( -zbayrak kullanıldığından beri ).
anthonybell

2

Bu basit komut ile bir dizini tekrar tekrar sıkıştırılmış bir arşive kopyalayabilirsiniz:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

Örneğin, içeriğini kopyalamak için /var/loggelen domain.comiçin ~/logs.tgzçalıştırmak:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

Borular kullanarak hedef sistemdeki dosyaları da çıkarabilirsiniz. Bu komut içeriğini kopyalar /var/logde domain.comhiç ~/destination/logsisteminizde:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Bir dizini yansıtmakla birlikte, muhtemelen kullanmalısın rsync...


1

Kullanıcının şifresini etkileşimli olarak girmek yerine bir parametre olarak iletmeyi tercih ederseniz, sshpass( sudo apt-get install -y sshpass) kullanabilirsiniz .

Örnek:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

Herhangi bir sistemde dizinleri art arda kopyalamak için -r seçeneğini scp komutuyla kullanabilirsiniz. Başka bir şeye ihtiyacınız olursa, scp komutu eğitimine bakın . -r seçeneği Linux komutlarının çoğunda özyinelemeli işlem anlamına gelir.


Doğru olsa da, -rseçenek yıllar önce önerilmiş ve kabul edilen cevap.
RalfFriedl

-3

Başka bir (muhtemelen tekrarlanan kullanım için daha iyi) seçeneği, NFS kullanmaktır - nfs-kernel-server'a bakın ve NFS paylaşımlarının nasıl kurulduğunu kontrol edin.


2
Bu tamamen saçmalık. Kullanacağınız sonsuz durumlar var scpama NFS bir seçenek değil.
Sven
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.