GNU/Linux >> Belajar Linux >  >> Linux

rsync hanya menyalin jenis file tertentu menggunakan opsi sertakan

Inilah bagian penting dari halaman manual:

Saat daftar file/direktori yang akan ditransfer dibuat, rsync memeriksa setiap nama yang akan ditransfer terhadap daftar pola sertakan/kecualikan secara bergantian, dan pola pencocokan pertama ditindaklanjuti:jika itu adalah pola pengecualian, maka file tersebut adalah dilewati; jika itu adalah pola sertakan maka nama file itu tidak dilewati; jika tidak ditemukan pola yang cocok, maka nama file tidak akan dilewati.

Untuk meringkas:

  • Tidak cocok dengan pola apa pun berarti file akan disalin!
  • Algoritme berhenti setelah ada pola yang cocok

Juga, sesuatu yang diakhiri dengan garis miring cocok dengan direktori (seperti find -type d akan).

Mari pisahkan jawaban ini dari atas.

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. Jangan lewati direktori apa pun
  2. Jangan lewatkan .sh apa pun file
  3. Lewati semuanya
  4. (Secara implisit, jangan lewatkan apa pun, tetapi aturan di atas mencegah aturan default agar tidak pernah terjadi.)

Terakhir, --prune-empty-directories menjaga aturan pertama dari membuat direktori kosong di semua tempat.


Saya pikir --include digunakan untuk menyertakan subkumpulan file yang dikecualikan oleh --exclude , daripada hanya menyertakan file tersebut. Dengan kata lain:Anda harus memikirkan tentang include artinya jangan kecualikan .

Coba saja:

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

Untuk rsync versi 3.0.6 atau lebih tinggi, urutan perlu diubah sebagai berikut (lihat komentar):

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

Menambahkan -m flag akan menghindari pembuatan struktur direktori kosong di tujuan. Diuji dalam versi 3.1.2.

Jadi jika kita hanya menginginkan file *.sh kita harus mengecualikan semua file --exclude="*" , sertakan semua direktori --include="*/" dan sertakan semua file *.sh --include="*.sh" .

Anda dapat menemukan beberapa contoh bagus di bagian Sertakan/Kecualikan Aturan Pola dari halaman manual


Satu tambahan lagi:jika Anda perlu menyinkronkan file dengan ekstensinya dalam satu direktori saja (tanpa rekursi) Anda harus menggunakan konstruksi seperti ini:

rsync -auzv --include './' --include '*.ext' --exclude '*' /source/dir/ /destination/dir/

Perhatikan titik di --include pertama . --no-r tidak berfungsi dalam konstruksi ini.

EDIT:

Terima kasih kepada gbyte.co untuk komentar berharganya!

EDIT:

-uzv flag tidak terkait langsung dengan pertanyaan ini, tetapi saya menyertakannya karena biasanya saya menggunakannya.


Jawaban oleh @chepner akan menyalin semua sub-direktori apakah itu berisi file atau tidak. Jika Anda perlu mengecualikan subdirektori yang tidak berisi file dan tetap mempertahankan struktur direktori, gunakan

rsync -zarv  --prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"

Linux
  1. Salin file dengan SCP dan Rsync

  2. Cara menyalin direktori secara rekursif menggunakan rsync sambil mengecualikan file tertentu

  3. Cara menyalin banyak file secara bersamaan menggunakan scp

  1. Bagaimana cara menyalin file melalui FTP menggunakan Ubuntu Linux?

  2. cp hanya file, melewatkan direktori

  3. Batasi rsync melalui ssh hanya baca / salin saja dari host jarak jauh

  1. Rsync, Hanya Sertakan Jenis File Tertentu Tidak Termasuk Beberapa Direktori?

  2. Mencatat Hanya File yang Ditransfer Dengan Rsync?

  3. Transfer SCP hanya mengubah file