GNU/Linux >> Belajar Linux >  >> Linux

Filter Rsync:Menyalin Satu Pola Saja?

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).
  • 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 ke rsync .
    • * setiap substring dari komponen direktori tunggal (yaitu tidak pernah cocok dengan / ); ** cocok dengan substring jalur mana pun.
  • Jika argumen sumber diakhiri dengan / , isinya disalin (rsync -r a/ b membuat b/foo untuk setiap a/foo ). Jika tidak, direktori itu sendiri akan disalin (rsync -r a b membuat b/a ).

Terkait:Kapan Anda akan menggunakan deskriptor file tambahan?

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/

Linux
  1. Sed:Cetak Hanya Kejadian Pertama Dari Kecocokan Pola?

  2. Mencatat Hanya File yang Ditransfer Dengan Rsync?

  3. Garis miring dan perintah rsync

  1. rsync N file terbaru dalam direktori

  2. Rsync menyalin direktori saat ini dengan nama

  3. Mengapa initrd saya hanya memiliki satu direktori, yaitu 'kernel'?

  1. Bagaimana Cara Masuk Direktori Yang Namanya Hanya Minus?

  2. Cara Menyinkronkan Hanya Satu Partisi?

  3. Bagaimana Memastikan Hanya Satu Contoh Skrip Bash yang Berjalan?