rsync mengecualikan direktori tidak berfungsi

34

Saya menjalankan Fedora 17 64-bit dan rsync --exclude=/home/ben/<dir>tidak berfungsi seperti yang diharapkan.

Saya mencoba rsyncdirektori home saya ke thumb drive, tetapi saya ingin mengecualikan tentu saja direktori yang menyimpan file cache dan membangun file. Ini adalah perintah yang saya gunakan:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Namun, konten dari ~/builddan ~/.ccachesedang disalin oleh rsync. Apa yang saya lakukan salah?

Freedom_Ben
sumber
1
Saya pikir mengecualikan pola tidak berfungsi.
Sören

Jawaban:

37

Global rsyncaturan filter yang diawali dengan terkemuka /yang berlabuh ke akar transfer. Mengutip dari bagian "INCLUDE / EXCLUDE ATURAN" halaman manual:

jika polanya dimulai dengan a / maka ia berlabuh ke tempat tertentu dalam hierarki file, jika tidak maka akan cocok dengan akhir pathname. Ini mirip dengan ^ dalam ekspresi reguler. Dengan demikian "/ foo" akan cocok dengan nama "foo" di "root transfer" (untuk aturan global) atau di direktori file gabungan (untuk aturan per-direktori).

Dalam perintah Anda ( rsync ... -arv /home/ben home-ben/), file /home/ben/fooakan ditransfer ke home-ben/ben/foo. Akar transfer adalah home-bendan jalur filter yang benar adalah /ben/foo. Demikian,

  • untuk mencocokkan /home/ben/.ccacheAnda memerlukan jalur filter/ben/.ccache
  • untuk mencocokkan /home/ben/build/Anda memerlukan jalur filter/ben/build/

Penjelasan lebih rinci dapat ditemukan di bagian "POLA YANG TERMASUK / TERMASUK" di rsync(1)halaman manual .


Perhatikan bahwa meninggalkan pemimpin saja /tidak selalu seperti yang Anda inginkan. Mengutip lagi dari bagian halaman manual yang sama:

"Foo" yang tidak memenuhi syarat akan cocok dengan nama "foo" di mana saja di pohon karena algoritma diterapkan secara rekursif dari atas ke bawah; itu berperilaku seolah-olah setiap komponen jalur mendapat giliran menjadi akhir nama file. Bahkan "sub / foo" yang tidak dikunci akan cocok pada titik mana pun dalam hierarki di mana "foo" ditemukan dalam direktori bernama "sub". Lihat bagian pada POLA YANG TERMASUK ANCORING / EXCLUDE untuk diskusi lengkap tentang cara menentukan pola yang cocok dengan akar transfer.

Dengan demikian pola filter build/akan cocok dengan direktori build di mana saja /home/ben, bahkan /home/ben/many/sub/directories/build/.

jw013
sumber
2
Detail kuncinya adalah bahwa slash penting. Jika Anda menambahkan garis miring pada akhir direktori sumber (rsync -sumber / tujuan) itu akan menyalin isi sumber, jika tidak rsync -a source destinationmenyalin direktori sumber itu sendiri ke tujuan. Ini menentukan apa akar dari transfer untuk menginformasikan ekspresi kecualikan. Penggunaan / dalam ekspresi pengecualian yang tepat kemudian dijelaskan di atas. Perhatikan khususnya yang rsync --exclude='/dir1' source destinationtidak akan mengecualikan apa pun.
pgoetz
11

Saya pikir excludejalur Anda harus relatif terhadap jalur sumber. Bisakah Anda mencoba ini?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

Inilah tes, untuk perbandingan:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
HorsePunchKid
sumber
2
Jawaban ini salah. Dengan jalur kecualikan relatif Anda akan mengecualikan pola di mana-mana!
rubo77
Posting ini benar. Pencocokan berbasis teks, bukan berbasis inode file. Jalur apa pun yang ditampilkan oleh --verboseperintah adalah format yang harus Anda gunakan.
Sridhar Sarnobat
Ini berhasil untuk saya.
Zhenyu
Bagaimana jika path sumber adalah '/' maka absolut adalah path relatif, tetapi masih tidak berfungsi.
Sören
Ini adalah satu-satunya hal yang berhasil untuk saya.
Jonathan
2

Saya punya masalah ini dalam sebuah skrip (saya tidak tahu apakah ini kasus Anda). Saya karena saya menggunakan perintah ini dalam skrip dan saya menggunakan sh bukan bash. periksa shebang di awal skrip Anda.

Jaoued Zahraoui
sumber
1

Pola kecualikan Anda akan berfungsi, jika Anda rsync seluruh jalur / rumah yaitu tanpa garis miring:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Tetapi lebih baik hanya rsync isi folder dengan garis miring:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

Anda juga dapat menggunakan daftar abaikan, lihat: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folderers

rubo77
sumber
0

Untuk mengecualikan folder tertentu dengan rsync, Anda perlu mempertimbangkan jalur relatif dalam perintah. dalam kasus Anda:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

di mana "ben" adalah folder yang Anda sinkronkan

Samoht Rusconi
sumber