venv/
perlu dikecualikan sebelum */
dimasukkan:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Kehalusannya adalah bahwa rsync
aturan proses dalam urutan dan aturan yang cocok pertama menang. Jadi, jika --include='*/'
sebelumnya --exclude='venv/'
, maka direktori venv/
dimasukkan oleh --include='*/'
dan aturan pengecualian tidak pernah dikonsultasikan.
Bisakah kita menyederhanakan ini?
Mengapa kita perlu --include='*/'
dan --exclude='*'
? Kenapa tidak --exclude=venv/ --include='*.py'
cukup?
Standarnya adalah memasukkan file / direktori. Jadi, pertimbangkan:
rsync -avz --exclude='venv/' --include='*.py' source target
Ini akan mencakup semua hal kecuali file atau direktori di bawah venv/
. Anda, bagaimanapun, hanya menginginkan .py
file. Itu berarti bahwa kita harus secara eksplisit mengecualikan file dengan --exclude='*'
.
--exclude='*'
tidak termasuk kedua file dan direktori. Jadi, jika kita tentukan --exclude='*'
, maka semua direktori akan dikecualikan dan hanya .py
file itu direktori root yang akan ditemukan. .py
file dalam subdirektori tidak akan pernah ditemukan karena rsync
tidak melihat ke direktori yang dikecualikan. Jadi, jika sudah --exclude='*'
, kita harus mengawalinya dengan --include='*/'
untuk memastikan bahwa isi dari semua direktori dieksplorasi.
--include='*/'
?