Inilah bagian penting dari halaman manual:
Saat daftar file/direktori yang akan ditransfer dibuat, rsync memeriksa setiap nama yang akan ditransfer terhadap daftar pola sertakan/kecualikan secara bergantian, dan pola pencocokan pertama ditindaklanjuti:jika itu adalah pola pengecualian, maka file tersebut adalah dilewati; jika itu adalah pola sertakan maka nama file itu tidak dilewati; jika tidak ditemukan pola yang cocok, maka nama file tidak akan dilewati.
Untuk meringkas:
- Tidak cocok dengan pola apa pun berarti file akan disalin!
- Algoritme berhenti setelah ada pola yang cocok
Juga, sesuatu yang diakhiri dengan garis miring cocok dengan direktori (seperti find -type d
akan).
Mari pisahkan jawaban ini dari atas.
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"
- Jangan lewati direktori apa pun
- Jangan lewatkan
.sh
apa pun file - Lewati semuanya
- (Secara implisit, jangan lewatkan apa pun, tetapi aturan di atas mencegah aturan default agar tidak pernah terjadi.)
Terakhir, --prune-empty-directories
menjaga aturan pertama dari membuat direktori kosong di semua tempat.
Saya pikir --include
digunakan untuk menyertakan subkumpulan file yang dikecualikan oleh --exclude
, daripada hanya menyertakan file tersebut. Dengan kata lain:Anda harus memikirkan tentang include artinya jangan kecualikan .
Coba saja:
rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"
Untuk rsync versi 3.0.6 atau lebih tinggi, urutan perlu diubah sebagai berikut (lihat komentar):
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
Menambahkan -m
flag akan menghindari pembuatan struktur direktori kosong di tujuan. Diuji dalam versi 3.1.2.
Jadi jika kita hanya menginginkan file *.sh kita harus mengecualikan semua file --exclude="*"
, sertakan semua direktori --include="*/"
dan sertakan semua file *.sh --include="*.sh"
.
Anda dapat menemukan beberapa contoh bagus di bagian Sertakan/Kecualikan Aturan Pola dari halaman manual
Satu tambahan lagi:jika Anda perlu menyinkronkan file dengan ekstensinya dalam satu direktori saja (tanpa rekursi) Anda harus menggunakan konstruksi seperti ini:
rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/
Perhatikan titik di --include
pertama . --no-r
tidak berfungsi dalam konstruksi ini.
EDIT:
Terima kasih kepada gbyte.co untuk komentar berharganya!
EDIT:
-uzv
flag tidak terkait langsung dengan pertanyaan ini, tetapi saya menyertakannya karena biasanya saya menggunakannya.
Jawaban oleh @chepner akan menyalin semua sub-direktori apakah itu berisi file atau tidak. Jika Anda perlu mengecualikan subdirektori yang tidak berisi file dan tetap mempertahankan struktur direktori, gunakan
rsync -zarv --prune-empty-dirs --include "*/" --include="*.sh" --exclude="*" "$from" "$to"