Bagaimana cara menyalin semua file dan direktori, kecuali yang tertentu di atas ssh?

23

Menggunakan baris perintah Linux, saya menggunakan scpperintah, untuk menyalin semua file dan folder dari direktori tertentu. Namun, saya tidak suka mengkonsumsi bandwidth, untuk menyalin hal-hal yang jarang saya ubah seperti tiny_mcefolder saya . Apa triknya untuk menyalin semuanya, tetapi lewati daftar folder pendek?

Michael Prokopec
sumber

Jawaban:

19

rsyncberfungsi dengan baik, dan dalam banyak kasus, menggunakan SSH secara otomatis sebagai protokol transportnya. Ini akan membandingkan file dan hanya mengunggah yang telah berubah - tetapi Anda juga dapat menggunakan daftar kecualikan untuk menentukan file di hierarki yang tidak boleh dirubah lagi.

Anthon
sumber
rsync tidak menggunakan SSH secara otomatis - Anda harus menyediakan flag "-e ssh" untuk melakukan itu.
4
Ya, benar. Rsync 2.6.0 dirilis - Shell jarak jauh default sekarang "ssh" kecuali jika Anda memberitahu mengkonfigurasi Anda ingin membuat sesuatu yang lain menjadi default. samba.org/rsync
12

Anda dapat mencoba rsync yang hanya menyalin file yang telah berubah, juga berfungsi di ssh.


sumber
9

Menggunakan rsync --excludeadalah pilihan yang lebih jelas di sini, tetapi jika Anda benar-benar ingin hanya mengirim beberapa file atau folder dan memiliki sesuatu yang khusus untuk dikecualikan, Anda dapat menggunakan shell globing with scp. Pertama, pastikan Anda memiliki opsi globing yang tepat di shell Anda. Untuk bash run shopt -s extglobdan untuk penggunaan zsh setopt ksh_glob. Maka sesuatu seperti ini:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... akan menyalin semua yang ada di folder sumber kecuali untuk hal-hal yang cocok dengan pola yang diberikan. Jelas Anda bisa berkreasi dengan bagian itu.

Caleb
sumber
7

rsync adalah solusi yang baik, tetapi jika Anda mencari alternatif:

Katakanlah, kita memiliki direktori "test" berisi direktori "foo, bar, baz". Dalam dirs ini ada banyak jenis file yang berbeda:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Kami ingin menyalin semuanya kecuali PNG

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

Dalam contoh ini, perintah akan meletakkan semua file ke direktori tujuan yang sama - ini mungkin bukan perilaku yang Anda inginkan.

Anthon
sumber
1
Perhatikan bahwa jawaban ini hanya berfungsi jika nama file dan direktori yang terlibat tidak mengandung karakter khusus shell (spasi atau \[*?).
Gilles 'SO- berhenti bersikap jahat'
3

Alat hebat yang mungkin ingin Anda coba adalah "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Anda juga dapat menggunakan RSync di atas ssh

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Harus bekerja

Kent Fredric
sumber
0

Saya baru saja selesai menulis bagaimana saya lebih suka berbarengan dengan rsync setiap hari, karena itu

  • tidak memerlukan daemon, selain ssh untuk transportasi
  • memungkinkan saya memodifikasi file di kedua sisi kapan saja - banyak master dengan mudah, sementara saya hanya perlu mendorong permintaan sinkronisasi dari satu sisi
  • Saya ngotot soal modtimes, atribut / izin, softlink, dll. Tidak ada masalah dengan itu; untuk satu proyek saya bahkan menggunakan 4 mirror, satu menjadi host cygwin. Lihat contoh pengaturan crontab saya.
  • mendukung pengecualian seperti *.bak. Sampel dalam file konfigurasi saya
Marcos
sumber
0

Menggunakan Secure Copy - scp

scp -r file user@host:

Untuk menyalin banyak file

scp /directory/* user@host:destinationPath

Untuk menyalin beberapa file

scp /directory/!(*.doc) user@host:destinationPath

Ini menyalin isi direktori kecuali file .doc

Yogeesh HT
sumber
0

Saya pasti akan merekomendasikan Anda rsync.

rsync -vra --exclude = "apa yang ingin Anda kecualikan" -e ssh folder user @ remotehost: / folder

amit singh
sumber
0

Inilah yang bekerja untuk saya ketika saya menjalankannya dari server tujuan.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
pengguna2373210
sumber
0

Kita dapat melakukannya dalam dua langkah untuk mengabaikan tiny_mcedirektori. Dengan asumsi semua direktori mulai dengan huruf kecil.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Juga, ubah USER, HOSTNAME, dan FOLDER ke nilai sebenarnya.

Fady Ibrahim
sumber