Cara mengecualikan folder dari rsync

60

Saya mencoba membuat cadangan folder rumah saya di drive NAS saya. Saya memberikan ini:

rsync -Paz --exclude-from 'rsync-exclude.txt' /home/chris/ [email protected]:LinuxHome

di mana rsync-exclude.txtmemiliki konten ini:

/home/chris/Downloads/*
/home/chris/Downloads/
/home/chris/Downloads/*.*

dan itu di folder yang sama saya jalankan rsync (folder home).

Namun rsync juga mencoba menyalin folder ini.

Apa yang saya lakukan salah?

xpanta
sumber

Jawaban:

88

Anda memberikan jalur absolut dalam daftar pengecualian Anda.

Dengan rsync, semua jalur kecualikan (atau sertakan!) Yang dimulai dengan /ditambatkan ke " root of transfer ".

Akar transfer dalam kasus ini adalah /home/chris. Jika Anda melakukannya:

rsync -Paz --exclude-from 'rsync-exclude.txt' / [email protected]:

... maka pengecualian Anda akan berfungsi (tetapi Anda akan menyalin semua hal lain di sistem file itu!).

Tetapi karena Anda hanya mencoba menyinkronkan direktori home Anda , dan tidak ada subdirektori dari /home/chrisnamanya "home/chris/Downloads", rsynctidak menemukan apa pun yang cocok.

Jadi coba hapus /home/chrisbagian dari rsync-exclude.txtfile Anda .

Sebenarnya, Anda hanya perlu satu baris dalam file:

/Downloads

Perhatikan bahwa jika Anda tidak menentukan /arahan, dan Anda memiliki direktori lain bernama "Downloads", itu juga akan dikecualikan. Saya berasumsi Anda hanya ingin mengecualikan direktori "tingkat atas" Anda (relatif terhadap direktori sumber, alias "root transfer") Downloads, jadi Anda ingin yang memimpin /.

CARA TERMUDAH (untuk mengecualikan hanya beberapa jalur)

Jika Anda hanya perlu mengecualikan satu direktori, lakukan saja ini (menghindari file terpisah):

rsync -Paz --exclude /Downloads /home/chris/ [email protected]:LinuxHome

Anda juga dapat menyatukan --excludetag, seperti:

rsync -Paz --exclude /Downloads --exclude '/Something Else' --exclude .hiddenFile /home/chris/ [email protected]:LinuxHome

Perhatikan bahwa karena tidak ada garis miring, salah satu yang akan mengecualikan .hiddenFiledari setiap setiap direktori itu salinan!

Tetapi jika Anda memiliki lebih dari beberapa pengecualian, Anda lebih baik dengan --exclude-fromdan file.

Catatan

Saya melihat bahwa Anda sudah benar, tetapi mereka yang baru untuk rsync harus diperhatikan garis miring pada akhir dari/home/chris/

Mengutip rsynchalaman manual, "Anda dapat menganggap trailing / pada sumber sebagai makna 'salin isi direktori ini' sebagai kebalikan dari 'salin direktori dengan nama'."

Jadi, jika Anda mengabaikan slash trailing itu, Anda akan berakhir dengan direktori yang disebut chrisdalam direktori target, yang berisi semuanya dari /home/chris(kecuali Downloadsdirektori asli , tentu saja!).

Lambart
sumber
2

Ini mungkin lebih mudah di mata, dan hanya catatan tentang mengecualikan direktori dan sintaksis:

SRC='/home/username'
DST='/run/media/username/EasyStoreRT/rsync'

rsync -avrh --stats                                 \
    --log-file=/home/username/log/rsync-home.log    \
    --exclude='/username/.cache'                    \
    --exclude='/username/.local/share/Trash'        \
    $SRC \
    $DST \

Ini akan mengecualikan direktori tersebut dan semua file di dalamnya. Untuk alasan apa pun, rysnc tidak menambahkan / home / nama pengguna ke /.cache. Hanya home / yang akan memasang sendiri, jadi saya harus menambahkan / nama pengguna ke setiap direktori yang dikecualikan.

Halaman manual mengatakan, "jika pola dimulai dengan a / maka ia berlabuh ke tempat tertentu dalam hierarki file, jika tidak maka cocok dengan akhir pathname." Tapi, hierarki itu tampaknya hanya menjadi direktori pertama di direktori sumber. Saya menggunakan bash, versi 4.4.23 (1) -release.

terima kasih
sumber