Menangani file atau direktori yang diubah namanya di rsync

26

Saya sedang mengerjakan rsyncskrip untuk replikasi direktori. Saya memilikinya hanya menyinkronkan file atau direktori yang baru dan dimodifikasi tetapi saya tidak menyukai fakta bahwa penyalinannya mengubah nama file atau direktori sebagai file atau direktori baru, menjaga file tidak sinkron. Saya juga telah menetapkan batas bandwidth 1MB karena ini akan berjalan selama jam kerja bisnis. Ini skrip saya:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

Bagaimana saya bisa menyimpan file dan direktori dalam sinkronisasi jika seseorang mengganti nama sesuatu, dengan masih hanya menyalin file baru atau yang dimodifikasi? Berikut adalah file yang dimaksud

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

Atau akan ada cara untuk bahkan memindahkan file berganti nama menjadi katakanlah direktori lain: /mymounts/VerControl?

jmituzas
sumber

Jawaban:

23

Anda dapat menangani file yang dipindahkan dan diganti namanya rsyncjika sistem file pada direktori sumber dan target memiliki dukungan untuk tautan keras. Idenya adalah membiarkan rsync merekonstruksi hard link sebelum transfer nyata. Anda dapat menemukan penjelasan yang brilian di sini .

Kami berakhir dengan solusi sederhana yang membuat pohon tautan keras yang tersembunyi di dalam direktori sumber / target, skrip dasarnya bisa seperti ini:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

Saya punya contoh skrip di GitHub . Tetapi saya menyarankan Anda untuk melakukan sejumlah besar pengujian sebelum menggunakan metode ini pada produksi.

dparoli
sumber
Juga "penjelasan cemerlang" yang Anda tautkan juga merujuk pada rsyncartikel dasar yang bagus ini, FWIW. everythinglinux.org/rsync
JakeGould
19

Anda mungkin ingin melihat -y | --fuzzyopsi rsync. Selain itu, rsync tidak memiliki cara untuk melacak nama, sehingga Anda pada akhirnya akan mentransfer file yang sudah diganti nama.

Dari manual rsync:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.
artyom
sumber
7
Perhatikan bahwa, jika menggunakan --fuzzy, Anda harus mempertimbangkan untuk memasangkannya ,--delete-delay seperti "rsync secara default melakukan a --delete-before, sehingga menghapus file basis sebelum dapat disalin / dipindahkan" . Sumber: Sonia Hamilton
Ronan Jouchet
1

Kamu tidak bisa

Rsync memiliki tiga mode,

  • Salin semua file
  • Salin file yang ada (dimodifikasi / tidak dimodifikasi) - pada ini Anda memiliki banyak pilihan
  • Salin file yang tidak ada.

Namun ketiga mode ini memiliki dua subkategori,

  • Kecualikan pada
  • Sertakan pada

Rsync tidak melacak file mana yang diganti namanya, ia tidak memiliki status. Pertimbangkan untuk menyalin semua file, dan mengecualikan yang tidak Anda inginkan. Anda tidak dapat memiliki daftar putih bergeser, Anda dapat memiliki daftar hitam.

rsync [..stuff..] --exclude 'lib/'
Evan Carroll
sumber
Gotcha terima kasih untuk inputnya harus hidup dengan file yang diganti namanya kemudian.
jmituzas
Anda dapat menghapusnya dari file yang tidak ada, itu tidak masalah. Tetapi sebagai fungsi salin, jika Anda mengganti nama menjadi sumber, itu akan menyalin file yang diganti namanya.
Evan Carroll
Saya dapat menyimpan versinya dengan -b dan mengatur suffix = date +%Y%m%d%k%M%Stoh saya bisa mendapatkan suffix = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas
0

Sejauh yang saya tahu, rsynctidak dapat mengenali nama file-file File baru harus ditransfer lagi. Lihat jawaban artyom .

Untuk menghapus file yang hilang, pastikan untuk menggunakan --deleteopsi.

Juga, untuk mirroring, saya akan merekomendasikan Anda untuk menggunakan -a( arsip ), yang alias beberapa opsi bagus.

Lihat man 1 rsyncdetailnya.

Lukas
sumber
terima kasih itu akan bekerja --delete / mymounts / test1 / / mymounts / test2 /
jmituzas