GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan Rsync sertakan dan kecualikan opsi untuk menyertakan direktori dan file berdasarkan pola

Inilah jawaban "ajari seseorang memancing":

Sintaks Rsync jelas tidak intuitif, tetapi perlu dipahami.

  1. Pertama, gunakan -vvv untuk melihat info debug untuk rsync.
$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *

Konsep utama di sini adalah bahwa rsync menerapkan pola include/exclude untuk setiap direktori secara rekursif. Segera setelah penyertaan/pengecualian pertama cocok, pemrosesan berhenti.

Direktori pertama yang dievaluasi adalah /Storage/uploads . Storage/uploads memiliki 1280000000/, 1260000000/, 1270000000/ dir/file. Tidak ada yang cocok dengan file_11*.jpg untuk memasukkan. Semuanya cocok dengan * untuk mengecualikan. Jadi mereka dikecualikan, dan rsync berakhir.

  1. Solusinya adalah menyertakan semua direktori (*/ ) pertama. Maka komponen dir pertama adalah 1260000000/, 1270000000/, 1280000000/ karena cocok dengan */ . Komponen dir selanjutnya adalah 1260000000/ . Di 1260000000/ , file_11_00.jpg cocok dengan --include="file_11*.jpg" , jadi disertakan. Dan seterusnya.
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg

https://download.samba.org/pub/rsync/rsync.1


Masalahnya adalah --exclude="*" mengatakan untuk mengecualikan (misalnya) 1260000000/ direktori, jadi rsync tidak pernah memeriksa isi direktori tersebut, jadi jangan pernah memperhatikan bahwa direktori tersebut berisi file yang akan cocok dengan --include Anda .

Saya pikir hal yang paling dekat dengan yang Anda inginkan adalah ini:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(yang akan menyertakan semua direktori, dan semua file yang cocok dengan file_11*.jpg , tetapi tidak ada file lain), atau mungkin ini:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(konsep yang sama, tetapi lebih memilih tentang direktori yang akan disertakan).


rsync sertakan contoh pola kecualikan:

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

Dan catatan terakhir adalah jangan mengandalkan tanda bintang yang digunakan di awal untuk mengevaluasi jalur; seperti "**dir" (tidak apa-apa untuk menggunakannya untuk folder atau file tunggal tetapi bukan jalur) dan perhatikan bahwa lebih dari dua tanda bintang tidak berfungsi untuk nama file.


Linux
  1. Alat Sysadmin:Menggunakan rsync untuk mengelola pencadangan, pemulihan, dan sinkronisasi file

  2. Garis miring dan perintah rsync

  3. rsync menggunakan regex untuk menyertakan hanya beberapa file

  1. Filter Rsync:Menyalin Satu Pola Saja?

  2. Apakah Menggunakan Rsync Saat Sumber Diperbarui Aman?

  3. Menggunakan rz dan sz di bawah shell linux

  1. 6 Contoh rsync untuk Mengecualikan Banyak File dan Direktori menggunakan pengecualian-dari

  2. temukan dan salin file menggunakan Bash

  3. Bagaimana cara menggunakan perintah 'cp' untuk mengecualikan direktori tertentu?