Hapus file asing dari dir dir melalui rsync?

51

Katakan saya punya

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Itu tidak menghapus hello.jpg dari DEST, ada ide bagaimana mengarsipkan ini?

Cheng
sumber

Jawaban:

72

Alasan perintah Anda tidak berfungsi dijelaskan oleh halaman manual untuk rsync (penekanan ditambahkan):

--menghapus

Ini memberitahu rsync untuk menghapus file asing dari sisi penerima (yang tidak ada di sisi pengirim), tetapi hanya untuk direktori yang sedang disinkronkan. Anda harus meminta rsync untuk mengirim seluruh direktori (mis. "Dir" atau "dir /") tanpa menggunakan wildcard untuk isi direktori (mis. "Dir / *") karena wildcard diperluas oleh shell dan rsync dengan demikian mendapat meminta untuk mentransfer file individual, bukan direktori induk file. File yang dikecualikan dari transfer juga dikecualikan dari dihapus kecuali jika Anda menggunakan opsi --delete-dikecualikan atau tandai aturan sebagai hanya cocok di sisi pengiriman (lihat pengubah sertakan / kecualikan di bagian FILTER RULES).

Jadi, saat Anda berlari

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

file yang tidak diinginkan dalam DEST tidak dihapus karena Anda belum benar-benar meminta direktori untuk disinkronkan, tetapi hanya untuk beberapa file tertentu. Untuk mendapatkan hasil yang Anda inginkan, coba sesuatu seperti ini:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Perhatikan bahwa urutan termasuk dan tidak termasuk masalah arahan. Pada dasarnya, setiap file diperiksa terhadap pola sertakan atau kecualikan sesuai urutan munculnya. Dengan demikian, file dengan ekstensi .jpg atau .txt disinkronkan karena cocok dengan pola "termasuk" sebelum cocok dengan pola "*" yang dikecualikan. Segala sesuatu yang lain dikecualikan oleh --exclude '*'polanya. The --delete-excludedMemastikan opsi yang bahkan dikecualikan file di sisi DEST akan dihapus.

Steven D
sumber
@Cheng, mau jelaskan sedikit lagi? Saya akan senang memperbarui jawaban saya jika ada masalah / peningkatan.
Steven D
Berhasil. Saya kira. Hal-hal - proses membingungkan saya, membuat saya berpikir itu dipindahkan lagi.
Cheng
Saya telah mengedit jawaban saya untuk menjelaskan lebih banyak.
Steven D
2
@Cheng: Saya kira Anda tidak menginginkannya --delete-excluded. Tanpa itu, hanya *.jpgdan *.txtdapat dihapus di sisi tujuan. Dengan itu, file yang tidak terkait akan dihapus juga. Anda mungkin tertarik pada tutorial ini tentang filter rsync .
Gilles 'SO- stop being evil'
3
Terima kasih! Bagi saya, saya kehilangan garis miring pada direktori sumber.
vaughan