Dalam rsync, bagaimana cara mengecualikan semua direktori yang cocok dengan suatu pola?

8

Dalam rsync saya mencoba untuk mengecualikan sub-direktori yang cocok dengan suatu pola. Tapi, saya tidak bisa membuatnya bekerja. Saya telah mengikuti beberapa contoh yang ditemukan di sini dan di Google. Tapi, saya tidak mendapatkan hasil yang benar. Ini adalah bit opsi dari perintah saya:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

Struktur direktori sumber saya adalah

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Ini adalah bagian dari skrip cadangan. $ LNK adalah tautan ke tujuan rsync hari sebelumnya.

Saya tidak ingin / root / branch1, / root / branch2, / root / branch3. atau isinya untuk disinkronkan. Tapi mereka.

Berikut adalah bit pengecualian yang sudah saya coba:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Terima kasih atas bantuan / sarannya.

EDIT - untuk mengatasi tanda "kemungkinan duplikat"

Pertanyaan ini berkenaan dengan daftar direktori yang diketahui. Saya perlu mengecualikan direktori yang mengikuti pola, bahkan jika direktori tersebut belum ada. yaitu dari contoh saya, direktori lain yang bernama /branch*dapat ditambahkan. Saya perlu membuat skrip saya menjadi bukti masa depan, dan menghindari mengedit skrip ketika direktori yang cocok dengan pola ditambahkan, karena direktori tersebut mungkin bersifat sementara.

Roger Creasy
sumber
parameter kecualikan Anda ok. Jika rsync mengabaikan cabang * saat menyalin, ia juga mengabaikannya ketika menghapus dari dest, jadi Anda harus menghapus dir ini secara manual di tujuan satu kali.
Ipor Sircer
tujuannya adalah direktori baru yang kosong, dibuat oleh skrip bash saya. Saya memang menghapus direktori * cabang dari direktori link-dest, tetapi tidak berhasil.
Roger Creasy
1
Anda harus menggunakan pola lengkap eksplisit suka *branch*atau /root/branch*tidak bentuk pendek branch*- pendek tidak ditemukan dan dengan demikian tidak dikecualikan.
Kondybas
@Kondybas Jadi, semua ok di opsi saya kecuali saya perlu menambahkan '*' ke cabang saya yang dikecualikan? ( --exclude '*branch*)
Roger Creasy

Jawaban:

2

Anda mengecualikan aturan sudah benar. Namun, rsync tidak akan menghapus file yang dikecualikan di tujuan tanpa parameter tambahan --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Contoh:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file
M. Glatki
sumber
Saya mengubah opsi saya di skrip ke -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKbackup tadi malam masih mendukung direktori / branch *.
Roger Creasy
1

rsync versi 3.1.3 (mungkin lebih awal, belum dicentang) dengan benar mengecualikan subdirektori menggunakan sintaks ini (jelas mengganti exclude_dirnamedengan pola yang ingin Anda kecualikan):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Ini juga berfungsi dengan wildcard. Pertanyaan asli digunakan 'branch*', jadi ini berfungsi:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

Semoga ini membantu.

AaronDanielson
sumber