Saya mencoba membuat direktori yang akan menampung semua dan hanya PDF saya yang dikompilasi dari LaTeX. Saya suka menyimpan setiap proyek di folder terpisah, semua disimpan di folder besar bernama LaTeX
. Jadi saya mencoba menjalankan:
rsync -avn *.pdf ~/LaTeX/ ~/Output/
yang seharusnya menemukan semua pdf di ~/LaTeX/
dan mentransfernya ke folder output. Ini tidak berfungsi. Ini memberi tahu saya bahwa tidak ada kecocokan untuk “*.pdf
“. Jika saya mengabaikan filter ini, perintah akan mencantumkan semua file di semua folder proyek di bawah LaTeX. Jadi ini masalah dengan filter *.pdf. Saya mencoba mengganti ~/
dengan path lengkap ke direktori home saya, tapi itu tidak berpengaruh.
Saya, menggunakan zsh. Saya mencoba melakukan hal yang sama di bash dan bahkan dengan filter yang mencantumkan setiap file di setiap subdirektori… Apa yang terjadi di sini?
Mengapa rsync tidak memahami filter hanya pdf saya?
OKE. Jadi perbarui:Tidak, saya sedang mencoba
rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/
Dan ini memberi saya seluruh daftar file. Saya kira karena semuanya cocok dengan pola pertama…
Jawaban yang Diterima:
TL,DR:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync menyalin sumber ke tujuan. Jika Anda lulus *.pdf
sebagai sumber, shell memperluas ini ke daftar file dengan .pdf
ekstensi di direktori saat ini. Tidak ada traversal rekursif yang terjadi karena Anda tidak melewatkan direktori apa pun sebagai sumber.
Jadi, Anda perlu menjalankan rsync -a ~/LaTeX/ ~/Output/
, tetapi dengan filter untuk memberi tahu rsync untuk menyalin .pdf
file saja. Aturan filter Rsync mungkin tampak menakutkan saat Anda membaca manual, tetapi Anda dapat membuat banyak contoh hanya dengan beberapa aturan sederhana.
-
Penyertaan dan pengecualian:
- Mengecualikan file menurut nama atau lokasi itu mudah:
--exclude=*~
,--exclude=/some/relative/location
(relatif terhadap argumen sumber, mis. ini mengecualikan~/LaTeX/some/relative/location
). - Jika Anda hanya ingin mencocokkan beberapa file atau lokasi, sertakan, sertakan setiap direktori yang mengarah ke sana (misalnya dengan
--include=*/
), lalu kecualikan sisanya dengan--exclude='*'
. Ini karena: - Jika Anda mengecualikan direktori, ini mengecualikan semua yang ada di bawahnya. File yang dikecualikan tidak akan dipertimbangkan sama sekali.
- Jika Anda menyertakan direktori, ini tidak otomatis menyertakan isinya. Dalam versi terbaru,
--include='directory/***'
akan melakukannya. - Untuk setiap file, aturan pencocokan pertama berlaku (dan semua yang tidak pernah cocok disertakan).
- Mengecualikan file menurut nama atau lokasi itu mudah:
-
Pola:
- Jika suatu pola tidak mengandung
/
, ini berlaku untuk nama file tanpa direktori. - Jika suatu pola diakhiri dengan
/
, ini hanya berlaku untuk direktori. - Jika sebuah pola dimulai dengan
/
, ini berlaku untuk seluruh jalur dari direktori yang diteruskan sebagai argumen kersync
. *
setiap substring dari komponen direktori tunggal (yaitu tidak pernah cocok dengan/
);**
cocok dengan substring jalur mana pun.
- Jika suatu pola tidak mengandung
-
Jika argumen sumber diakhiri dengan
/
, isinya disalin (rsync -r a/ b
membuatb/foo
untuk setiapa/foo
). Jika tidak, direktori itu sendiri akan disalin (rsync -r a b
membuatb/a
).
Jadi di sini kita perlu memasukkan *.pdf
, sertakan direktori yang memuatnya, dan kecualikan yang lainnya.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Perhatikan bahwa ini menyalin semua direktori, bahkan direktori yang tidak berisi file yang cocok atau subdirektori yang berisi satu. Ini dapat dihindari dengan --prune-empty-dirs
opsi (ini bukan solusi universal karena Anda tidak dapat menyalin direktori bahkan dengan mencocokkannya secara eksplisit, tetapi itu adalah persyaratan yang jarang terjadi).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/