Rsync, hanya menyertakan jenis file tertentu tidak termasuk beberapa direktori

14

Saya ingin rsync hanya tipe file tertentu (mis. .py) Dan saya ingin mengecualikan file dalam beberapa direktori (mis venv.).

Inilah 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.

CentAu
sumber
mengapa Anda membutuhkan inisial --include='*/'?
Charlie Parker
1
Bagaimana cara membuat perintah jika saya memiliki direktori rekursif yang ingin saya kirim hanya satu jenis file. Tampaknya hanya melakukannya untuk direktori target mungkin karena mengecualikan terakhir yang mengecualikan semuanya
Charlie Parker

Jawaban:

17

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.

John1024
sumber
Bagus! Terima kasih! Hanya untuk pengertian saya, mengapa kita perlu --include='*/'dan --exclude='*'? Kenapa hanya --exclude=venv/ --include='*.py'tidak berfungsi?
CentAu
1
@CentAu Saya baru saja memperbarui jawabannya dengan diskusi tentang itu.
John1024
Bagaimana cara membuat perintah jika saya memiliki direktori rekursif yang ingin saya kirim hanya satu jenis file. Tampaknya hanya melakukannya untuk direktori target mungkin karena mengecualikan terakhir yang mengecualikan semuanya.
Charlie Parker
1
Bookmark! Terutama untuk kehalusannya. Saya tidak bisa memikirkan utilitas CLI lain di mana urutan bendera penting sama sekali!
antortjim