mkdir -p test/a/b/c/d/e
mkdir -p test/dest
rsync -nvraL test/a test/dest --exclude=a/b/c/d
Ini bekerja. Sebagai test/a
adalah direktori dasar yang disinkronkan, pola pengecualian ditentukan dengan memulai dengan a/
Tunjukkan kami jalur/pengecualian sebenarnya jika ini tidak membantu.
Menjalankan rsync dengan -vn akan mencantumkan dirs/file - polanya dicocokkan dengan format yang dicetak rsync.
Salah satu dari ini akan berhasil:
rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Perhatikan akhiran /
di jalur sumber membuat perbedaan penting pada bagaimana --exclude
harus ditentukan. Ini mengasumsikan kita memiliki:
mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest
Posting Asli mengalami kesulitan saat mengecualikan jalur dimulai dengan /
. Jawaban Daniel benar bahwa inisial /
di jalur pengecualian mungkin diinginkan untuk mengecualikan jalur tertentu, dan bahwa /
awal ini harus dipahami seperti memimpin ^
dalam ekspresi reguler. Namun, jawabannya memiliki kesalahan ketik yang kritis tentang akhiran /
di jalur sumber.
Mengikuti contoh Erik, Anda ingin melakukan ini:
rsync -nvraL test/a/ test/dest --exclude=/b/c/d
Sebenarnya, baik jawaban Erik maupun Antoni tidak sepenuhnya akurat.
Erik setengah benar dalam mengatakan itu
Karena test/a adalah direktori dasar yang disinkronkan, pola pengecualian ditentukan dengan memulai dengan a/
Benar bahwa root pola kecualikan adalah test/a
(yaitu pola /some/path
mengikat ke test/a/some/path
), tapi itu bukan keseluruhan ceritanya.
Dari halaman manual:
jika pola dimulai dengan a / maka pola tersebut ditambatkan ke titik tertentu dalam hierarki file, jika tidak maka akan dicocokkan dengan akhir nama path. Ini mirip dengan ^ terkemuka dalam ekspresi reguler. Jadi "/foo" akan cocok dengan file bernama "foo" di "root of the transfer" (untuk aturan global) atau di direktori file gabungan (untuk aturan per-direktori).
Kita dapat mengabaikan per-directory
sedikit karena tidak berlaku untuk kami di sini.
Oleh karena itu, rsync -nvraL test/a test/dest --exclude=a/b/c/d
pasti akan mengecualikan test/a/b/c/d
(dan anak-anak), tetapi juga akan mengecualikan test/a/other/place/a/b/c/d
.
rsync -nvraL test/a test/dest --exclude=/b/c/d
, sebaliknya, akan mengecualikan hanya test/a/b/c/d
(dan anak-anak) (test/a
menjadi titik di mana /
berlabuh).
Inilah mengapa Anda masih memerlukan garis miring inital penahan jika Anda ingin mengecualikan jalur tertentu dari yang didukung. Ini mungkin tampak seperti detail kecil, dan ini akan menjadi semakin spesifik pola pengecualian Anda (mis. Pictures
vs. home/daniel/Pictures
) tetapi itu mungkin hanya datang untuk menggigit Anda.