Bir komutta birden çok dosyayı scp üzerinden nasıl kopyalayabilirim?


20

Bir PC'den diğerine (her ikisi de Linux) birçok dosya taşımak zorundayım. Bunun için kullanmak istiyorum scp, ancak scpbir kerede yalnızca bir dosya aktarmaya izin veriyor.

Bunu nasıl yapabilirim?

Sahibim

  • Rsync veya başka bir protokol kullanma imkanı yok
  • Parola içermeyen sertifikaları kullanma olanağı yoktur (ancak parolaya sahip bir sertifikaya sahiptir)
  • Aktarılacak dosyaların listesi ve diğer sunucudaki dosyaların hedef yolunu içeren bir liste
  • Dosyalar çok sayıda dizin üzerine yayılmış ve kopyalamak istediğim dizinlerdeki tüm dosyalar değil

Mümkünse, bant genişliğinden tasarruf etmek için şeffaf bir şekilde gzip ve ungzip yapmak istiyorum!

Mümkün mü?

Yanıtlar:


31

Kullanım tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
Heres dosya formatı: "c modunda, tar dosya adından arşivlenecek isimleri okuyacaktır. -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C '' özel adı ."
Kousha

14

Bunun için scp kullanmak istiyorum, ancak scp her seferinde sadece bir dosya aktarmaya izin veriyor.

En azından scpçoğu Linux dağıtımında bulunan OpenSSH tarafından sağlanan komut için doğru olmadığından eminim .

Kullandığım scp file1 file2 ... fileN user@host:/destination/directory/oldukça sık.

Saydam sıkıştırma için, SSH protokolü yerleşik olarak bulunur ve komut satırında seçeneği scpsağlarsanız kullanabilirsiniz -C. Benzer küçük dosyalar için, akira tarafından önerilen tar + gz seçeneğini daha iyi sıkıştırma kazanır, çünkü scpher dosyayı ayrı bir varlık olarak sıkıştırdığı bu dosyalar arasında benzerlikten yararlanabilir . Genellikle scp kullanmayı tercih ederim, çünkü kısmi bir aktarımı devam ettirmek daha kolay (veya bu durumda sorgulayıcının seçeneği olmadığını biliyorum) rsyncçünkü hem devam etmek hem de tar + gz seçeneğinin bütününü paylaşmak daha kolay akış sıkıştırma avantajı.


Bu doğru cevap, ama gerçekten bir seferde sadece bir dosya aktarıyor. Bununla birlikte, kullanılabilir bant genişliğini tam olarak kullanacaktır ve mümkün olduğunca hızlı çalışmalıdır.
Benjamin Bannier

4

Çalışmıyor mu scp -r yourdir otherhost:/otherdir?

Bunu deneyin o zaman:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

zkatran -flag sıkıştırma yapar. Veya ssh için -C'yi kullanabilirsiniz:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

ne gelmez -Cmi?
Nathan Fellman

1
Sorun şu ki, bir dosya listem var. Dosyalar çok sayıda dizin üzerine yayılmış ve kopyalamak istediğim dizinlerdeki tüm dosyalar değil
Peter Smit

2
@Nathan: -C sıkıştırma yapmak için.
Jimmy Hedman

1

RHEL5'te, özel karakterler (boşluk gibi) içeren dosyaların bir listesini güvenli bir şekilde kopyalamayı bilmemin mümkün olan tek yolu. Bir kabuk komut dosyası oluşturun ve aşağıdakileri ekleyin:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

Çok sorun olmadan yapılabilir.

Ben sadece her dosyanın yanında hostname ile dosyaların bir listesini oluşturmak ve scp iyi ayrıştırmak gibi görünüyor. yani.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp bu sözdizimi ile iyi çalışıyor gibi görünüyor. Her dosyanın yanında ana bilgisayar adı olmadan denediğimde, ilk dosyadan sonra başarısız oldu. Daha önce bunun için kullandığım başka bir sözdizimini hatırlıyorum ve bulduktan sonra göndereceğim.


Bu çalışıyor, ancak oldukça yavaş - her dosya için bir bağlantı başlatmak gibi görünüyor ... (Buraya yavaş kopya için bir çözüm arıyor ...) ~/çoğunlukla dışarıda bırakılabilir - SCP ana dizine göre çalışır. .. Başka bir yerden bir listeniz varsa $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Bu, boşluklu dosya adları için kırılacaktır)
Gert van den Berg

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.