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 memberitahu rsync untuk menyalin .pdf
file saja. Aturan filter Rsync tampak menakutkan ketika Anda membaca manual, tetapi Anda dapat membuat banyak contoh hanya dengan beberapa aturan sederhana.
Inklusi dan pengecualian:
- Tidak termasuk file dengan nama atau lokasi mudah:
--exclude=*~
, --exclude=/some/relative/location
(relatif terhadap argumen sumber, misalnya tidak termasuk ini ~/LaTeX/some/relative/location
).
- Jika Anda hanya ingin mencocokkan beberapa file atau lokasi, sertakan, sertakan setiap direktori yang mengarah ke mereka (misalnya dengan
--include=*/
), lalu kecualikan sisanya dengan --exclude='*'
. Hal ini karena:
- Jika Anda mengecualikan direktori, ini mengecualikan semua yang ada di bawahnya. File yang dikecualikan tidak akan dianggap sama sekali.
- Jika Anda memasukkan direktori, ini tidak termasuk isinya secara otomatis. Dalam versi terbaru,
--include='directory/***'
akan melakukannya.
- Untuk setiap file, aturan pencocokan pertama berlaku (dan apa pun yang tidak pernah cocok disertakan).
Pola:
- Jika suatu pola tidak mengandung a
/
, itu berlaku untuk direktori nama file sans.
- Jika suatu pola diakhiri dengan
/
, itu hanya berlaku untuk direktori.
- Jika sebuah pola dimulai dengan
/
, itu berlaku untuk seluruh jalur dari direktori yang diteruskan sebagai argumen rsync
.
*
substring dari komponen direktori tunggal (yaitu tidak pernah cocok /
); **
cocok dengan semua substring jalur.
Jika argumen sumber berakhir dengan /
, isinya disalin ( rsync -r a/ b
menciptakan b/foo
untuk setiap a/foo
). Kalau tidak, direktori itu sendiri disalin ( rsync -r a b
membuat b/a
).
Jadi di sini kita perlu memasukkan *.pdf
, memasukkan direktori yang mengandungnya, dan mengecualikan yang lainnya.
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Perhatikan bahwa ini menyalin semua direktori, bahkan yang tidak mengandung file yang cocok atau subdirektori yang mengandungnya. Ini dapat dihindari dengan --prune-empty-dirs
opsi (itu bukan solusi universal karena Anda kemudian tidak dapat menyalin direktori bahkan dengan mencocokkannya secara eksplisit, tapi itu persyaratan yang langka).
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
**
pola zsh ) harusnya bekerja.