Saya hanya ingin menyinkronkan jenis file tertentu (mis. .py
) dan saya ingin mengecualikan file di beberapa direktori (mis. venv
).
Ini yang saya coba:
rsync -avz --include='*/' --exclude='venv/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Tapi itu tidak berhasil.
Apa yang saya lewatkan?
Saya juga mengikuti jawaban untuk pertanyaan ini tetapi tidak membantu.
Jawaban yang Diterima:
venv/
perlu dikecualikan sebelum */
sudah termasuk:
rsync -avz --exclude='venv/' --include='*/' --include='*.py' --exclude='*' /tmp/src/ /tmp/dest/
Seluk-beluknya adalah rsync
memproses aturan secara berurutan dan aturan pencocokan pertama menang. Jadi, jika --include='*/'
ada sebelum --exclude='venv/'
, lalu direktori venv/
disertakan oleh --include='*/'
dan aturan pengecualian tidak pernah dikonsultasikan.
Bisakah kita menyederhanakan ini?
Mengapa kita membutuhkan
--include='*/'
dan--exclude='*'
? Mengapa tidak--exclude=venv/ --include='*.py'
cukup?
Standarnya adalah menyertakan file/direktori. Jadi, pertimbangkan:
rsync -avz --exclude='venv/' --include='*.py' source target
Ini akan mencakup semuanya kecuali file atau direktori di bawah venv/
. Namun, Anda hanya menginginkan .py
file. Itu berarti kita harus secara eksplisit mengecualikan file lain dengan --exclude='*'
.
--exclude='*'
tidak termasuk keduanya file dan direktori. Jadi, jika kita menentukan --exclude='*'
, maka semua direktori akan dikecualikan dan hanya .py
file itu direktori root akan ditemukan. .py
file dalam subdirektori tidak akan pernah ditemukan karena rsync
tidak melihat ke direktori yang dikecualikan. Jadi, jika kita memiliki --exclude='*'
, kita perlu mengawalinya dengan --include='*/'
untuk memastikan bahwa isi dari semua direktori dieksplorasi.