venv/perlu dikecualikan sebelum */ dimasukkan:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Kehalusannya adalah bahwa rsyncaturan 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 .pyfile. 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 .pyfile itu direktori root yang akan ditemukan. .pyfile dalam subdirektori tidak akan pernah ditemukan karena rsynctidak melihat ke direktori yang dikecualikan. Jadi, jika sudah --exclude='*', kita harus mengawalinya dengan --include='*/'untuk memastikan bahwa isi dari semua direktori dieksplorasi.
--include='*/'?