Bagaimana cara mengecualikan banyak direktori dengan rsync?

184

Saya mencoba mem-backup direktori home saya menggunakan rsync, dan saya ingin mengecualikan beberapa direktori yang berisi sampah. Saya ingin secara khusus mengecualikan /home/ben/.ccachedan /home/ben/build. Sayangnya dokumentasi untuk rsync adalah informasi yang berlebihan dan tidak menjawab pertanyaan saya. Inilah yang saya coba:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/

Apa cara yang tepat untuk melakukan ini?

Freedom_Ben
sumber
4
Hanya ingin mengatakan bahwa bendera sudah amenyiratkan r:)-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
Populus

Jawaban:

238

OK saya merasa sangat bodoh. Bahkan sebelum saya memposting pertanyaan ini teman saya menunjukkan kepada saya bagaimana melakukannya dan itu sangat sederhana. Untuk mengecualikan beberapa direktori Anda cukup menggunakan beberapa --exclude=pathsakelar. Jadi perintah saya di atas ditulis dengan benar adalah sebagai berikut:

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Freedom_Ben
sumber
7
Jalur absolut tidak berfungsi untuk saya (direktori yang ditentukan tidak dikecualikan secara diam-diam), sedangkan jalur relatif ke direktori sumber bekerja dengan benar. Mungkin saya kehilangan sesuatu, tetapi saya akan berhati-hati tentang pernyataan @FreeSoftwareServers bahwa jalur absolut selalu berfungsi.
Soren Bjornstad
5
FYI: Opsi ini -atermasuk -rjadi -armubazir.
David
4
Bertentangan dengan apa yang diyakini FreeSoftwareServers, jalur kecualikan relatif terhadap jalur sumber, BUKAN /. Sehingga komentar itu pasti salah dan akan menyebabkan kegagalan jika Anda mengikutinya. Strategi terbaik adalah meninggalkan pemimpin / tidak termasuk Anda untuk menghindari jenis kesalahan mental ini. Jika sumbernya adalah, / home / me dan jika Anda mengecualikan = '/ mydir /' ini mengecualikan direktori mydir di / home / me, artinya, tidak termasuk / home / me / mydir TIDAK / mydir / di /. Sangat disayangkan saya tidak bisa menurunkan atau mengedit komentar itu karena secara teknis salah dan akan menyesatkan.
Lizardx
3
FYI untuk pelancong selanjutnya, sepertinya komentar yang dimaksud oleh @FreeSoftwareServer telah dihapus. tl; dr: gunakan jalur relatif
Freedom_Ben
2
Jika Anda bodoh maka saya dan 179 pendukung lainnya!
Sridhar Sarnobat
108

Ketika memiliki beberapa direktori dan / atau file untuk dikecualikan, buat file teks dan gunakan --exclude-fromsakelar. Buat file dipanggil exclude_me.txtdan di dalamnya cantumkan pengecualian Anda. Contoh ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors

Maka rsync Anda akan terlihat seperti ini:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/

Ini adalah beberapa informasi tentang aturan filter yang dapat membantu:

  • /dir/ berarti mengecualikan folder root /dir
  • /dir/*berarti mendapatkan folder root /dirtetapi bukan isinya
  • dir/ berarti mengecualikan folder apa pun di mana pun namanya mengandung dir/

  • Contoh yang dikecualikan: /dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cfberarti melewatkan file yang dimulai dengan cffolder apa pun di dalamnya/var/spool/lpd

Juga lihat bagian aturan filter pada halaman manual.

pengguna228759
sumber
4
Penting untuk dicatat bahwa folder root berarti root transfer bukan direktori root.
jamesdlin
Ini jawaban yang cemerlang!
Alexander Zhukov
85

Anda juga dapat mengecualikan beberapa jalur dalam kurung kurawal:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
György Ráth
sumber
40
ini bekerja dengan baik, tidak hanya di bawah sh, hanya di bawah bash, saya menemukan "jalan yang sulit"
xor
7
Tidak ada ruang setelah koma. Belajar bahwa cara yang sulit juga 😭
styl3r
Dan jangan gunakan '' seperti --exclude = '. Gvfs'
Martin T.
FWIW, saya pikir kawat gigi keriting bekerja dengan ksh. Untuk kerang lainnya, Anda mungkin bisa menggunakan sesuatu seperti: IFS=$'\n'; rsync -arv $(printf '.ccache\nbuild\n' | sed 's/^/--exclude=/g') /home/ben /media/ben/thumbdrive/. Atau, Anda bisa menggunakan beberapa --excludeargumen, yang harus Anda ketikkan secara manual.
TSJNachos117
1
Alasan ini berhasil adalah karena "Ekspansi Brace", kalau-kalau ada yang ingin melihat detailnya.
shredalert