Saya mencoba membuat direktori yang akan menampung semua dan hanya PDF saya yang dikompilasi dari LaTeX. Saya suka menyimpan setiap proyek dalam folder terpisah, semua disimpan di folder besar bernama LaTeX
. Jadi saya mencoba berlari:
rsync -avn *.pdf ~/LaTeX/ ~/Output/
yang harus menemukan semua pdf ~/LaTeX/
dan mentransfernya ke folder keluaran. Ini tidak berfungsi. Ini memberi tahu saya bahwa tidak ditemukan kecocokan untuk " *.pdf
". Jika saya meninggalkan filter ini, perintah ini mencantumkan semua file di semua folder proyek di bawah LaTeX. Jadi ada masalah dengan filter * .pdf. Saya mencoba mengganti ~/
dengan path lengkap ke direktori home saya, tetapi itu tidak berpengaruh.
Saya, menggunakan zsh. Saya mencoba melakukan hal yang sama di bash dan bahkan dengan filter yang mendaftar setiap file di setiap subdirektori ... Apa yang terjadi di sini?
Mengapa rsync tidak memahami hanya filter pdf saya?
BAIK. 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 ...
**
pola zsh ) harusnya bekerja.Jawaban:
TL, DR:
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:
--exclude=*~
,--exclude=/some/relative/location
(relatif terhadap argumen sumber, misalnya tidak termasuk ini~/LaTeX/some/relative/location
).--include=*/
), lalu kecualikan sisanya dengan--exclude='*'
. Hal ini karena:--include='directory/***'
akan melakukannya.Pola:
/
, itu berlaku untuk direktori nama file sans./
, itu hanya berlaku untuk direktori./
, itu berlaku untuk seluruh jalur dari direktori yang diteruskan sebagai argumenrsync
.*
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
menciptakanb/foo
untuk setiapa/foo
). Kalau tidak, direktori itu sendiri disalin (rsync -r a b
membuatb/a
).Jadi di sini kita perlu memasukkan
*.pdf
, memasukkan direktori yang mengandungnya, dan mengecualikan yang lainnya.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).sumber
**
pola zsh ), ini menciptakan kembali struktur direktori di direktori target. Saya tidak yakin apakah ini yang diinginkan OP .../etc/lsyncd/lsyncd.conf.lua
file. Punya ide?Standarnya adalah untuk memasukkan semuanya, jadi Anda harus secara eksplisit mengecualikan semua setelah memasukkan file yang ingin Anda transfer. Hapus --dry-run untuk benar-benar mentransfer file.
Jika Anda memulai dengan:
Kemudian pencocokan serakah akan mengecualikan semuanya langsung.
Jika kamu mencoba:
Maka hanya file pdf di folder tingkat atas yang akan ditransfer. Itu tidak akan mengikuti direktori apa pun, karena itu dikecualikan oleh '*'.
sumber
--prune-empty-dirs
(atau pintasan-m
), Anda bahkan menyimpan banyak direktori kosong di tempat tujuan, kecuali tentu saja Anda menginginkannya sebagai pengingat atau cetak biru struktural./etc/lsyncd/lsyncd.conf.lua
file. Punya ide?Jika Anda menggunakan pola seperti
*.pdf
, shell "memperluas" pola itu, yaitu itu mengganti pola dengan semua kecocokan di direktori saat ini. Perintah yang Anda jalankan (dalam hal ini rsync) tidak mengetahui fakta bahwa Anda mencoba menggunakan pola.Saat Anda menggunakan zsh , ada solusi mudahnya:
**
Pola dapat digunakan untuk mencocokkan folder secara rekursif. Coba ini:sumber
rsync -avn ~/LaTeX/**/*.pdf ~/Output
, tetapi solusi dengan--include
lebih scalable.**
mungkin menjadi berguna dalam situasi lain juga.cd ~/Latex && cp -p **/*.pdf ~/Output
untuk menghindari kesalahan "baris perintah terlalu panjang".Anda dapat menggunakan
find
dan daftar file perantara (files_to_copy
) untuk menyelesaikan masalah Anda. Pastikan Anda berada di direktori home Anda, lalu:find LaTeX/ -type f -a -iname "*.pdf" > files_to_copy && rsync -avn --files-from=files_to_copy ~/ ~/Output/ && rm files_to_copy
Diuji dengan Bash.
sumber
-exec
opsi menemukan atau menggunakanxargs
. Sesuatu seperti:find LaTeX/ -type f -iname "*.pdf" -print0 | xargs -0 -i rsync -avn {} Output/
standalone
atau yang tidak memiliki.tex
file dengan nama yang sama, karena ini akan menjadi gambar yang disertakan dalam beberapa dokumen ...--files-from
menerima pembacaan dari stdin. Ini akan berhasilfind LaTeX/ -type f -a -iname "*.pdf" | rsync -avn --files-from=- ~/ ~/Output/
Menilai dari bagian "TERMASUK / MENGECUALIKAN POLA" dari halaman manual , cara untuk melakukan ini adalah
Perbedaan kritis antara ini dan jawaban kbrd adalah
--include="*/"
bendera, yang memberitahu rsync untuk melanjutkan dan menyalin direktori yang ditemukannya, apa pun namanya. Ini diperlukan karena rsync tidak akan muncul lagi ke dalam subdirektori kecuali telah diperintahkan untuk menyalin subdirektori itu.Juga, perhatikan bahwa tanda kutip mencegah shell mencoba memperluas pola ke nama file relatif ke direktori saat ini, dan melakukan salah satu dari yang berikut:
Berhasil dan mengacaukan filter Anda (tidak terlalu mungkin di tengah-tengah bendera seperti itu, meskipun Anda benar-benar tidak pernah tahu kapan seseorang akan membuat file bernama
--include=foo.pdf
...)Gagal, dan berpotensi menghasilkan kesalahan alih-alih menjalankan perintah (seperti yang Anda temukan zsh lakukan secara default).
sumber
include
barang tambahan yang sudah ada di sana tidak mengubah apa pun. Jika Anda melihat apa yang saya maksud ...--exclude="*"
setelah--include="*.pdf"
, atau ini akan mentransfer segalanya.Bagaimana dengan ini:
sumber
man rsync
letakkan filter setelah opsi dan sebelum sumber / tujuan. Saya mencoba ini dan itu tidak berhasila
opsinya adalah untuk arsip dan antara lain membuat salinannya menjadi rekursif.Berikut adalah sesuatu yang harus berfungsi tanpa menggunakan find. Perbedaan dari jawaban yang sudah diposting adalah urutan aturan filter. Aturan filter dalam perintah rsync sangat mirip dengan aturan iptable, aturan pertama yang cocok dengan file adalah yang digunakan. Dari halaman manual :
Dengan demikian, Anda memerlukan perintah sebagai berikut:
Perhatikan pola "**. Pdf". Menurut halaman manual :
Dalam pengujian kecil saya, ini bekerja secara rekursif ke bawah pohon direktori dan hanya memilih pdf.
sumber
*.pdf
di direktori tingkat atas (tetapi tidak~/LaTeX/foo/bar.pdf
).**
. Akan menyenangkan untuk memiliki contohnya. ;)Ini adalah solusi pilihan saya:
The
find
perintah lebih mudah untuk memahami daripada include / mengecualikan aturanrsync
:-)Jika Anda hanya ingin menyalin file pdf, ubah saja
.jpg
ke.pdf
sumber