Yeniden adlandırılmış dosyaları veya dizinleri rsync'de işleme


26

rsyncDizin çoğaltması için bir komut dosyası üzerinde çalışıyorum . Yalnızca yeni ve değiştirilmiş dosyaları veya dizinleri senkronize ettim ancak dosyaların senkronize edilmemesini sağlayarak, yeniden adlandırılmış dosyaları veya dizinleri yeni bir dosya veya dizin olarak kopyalamasından hoşlanmıyorum. Ayrıca, çalışma saatleri içerisinde geçerli olacağı için 1 MB bant genişliği sınırını belirledim. İşte betiğim:

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

Birisi yeniden adlandırırsa, yalnızca yeni veya değiştirilmiş dosyaları kopyalarken, dosyaları ve dizinleri nasıl senkronize edebilirim? İşte söz konusu dosyalar

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

Ya da yeniden adlandırılmış dosyaları başka bir dizine taşımak için bir yol var /mymounts/VerControlmı?

Yanıtlar:


23

rsyncKaynak ve hedef dizindeki dosya sistemleri sabit bağlantılar için destek sağlıyorsa, taşınmış ve yeniden adlandırılmış dosyaları işleyebilirsiniz . Buradaki fikir, rsync'in gerçek aktarımdan önce sabit bağlantıları yeniden oluşturmasına izin vermektir. Sen bulabilirsiniz burada parlak bir açıklama .

Kaynak / hedef dizinin içinde gizli bir sert bağlantı ağacı oluşturan basit bir çözümle sonuçlandık; temel komut dosyası şöyle olabilir:

# 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"

Ben GitHub'dan bir örnek senaryosunu . Ancak, bu yöntemi üretimde kullanmadan önce büyük miktarda test yapmanızı öneririm.


Ayrıca linklediğiniz “mükemmel açıklama”, bu harika temel rsyncmakale olan FWIW'yi de ifade eder . everythinglinux.org/rsync
JakeGould

19

-y | --fuzzyRsync seçeneğine bakmak isteyebilirsiniz . Bunun dışında, rsync'in isimleri izlemesinin bir yolu yoktur, bu yüzden yeniden adlandırılmış dosyayı transfer edersiniz.

Rsync man sayfasından:

   -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.

7
Kullanarak takdirde, Not --fuzzy, sen ile coupling düşünmelisiniz --delete-delayolarak, "varsayılan olarak rsync'i bir yapar --delete-beforeo kopyalanabilir önce böylelikle / taşınmış taban dosyasını kaldırma" . Kaynak: Sonia Hamilton
Ronan Jouchet

1

Yapamazsın

Rsync'in üç modu vardır

  • Tüm dosyaları kopyala
  • Mevcut (değiştirilmiş / değiştirilmemiş) dosyaları kopyala - bu konuda birçok seçeneğiniz var
  • Var olmayan dosyaları kopyalayın.

Ancak bu üç modun iki alt kategorisi vardır,

  • Hariç tut
  • Dahil

Rsync, hangi dosyaların yeniden adlandırıldığını izlemez, durumu yoktur. Yerine kopyalama düşünün tüm dosyaları ve olanları hariç yok istiyorum. Değişen-beyaz listeniz olamaz, kara listeniz olabilir.

rsync [..stuff..] --exclude 'lib/'

giriş için teşekkürler, o zaman yeniden adlandırılmış dosyalar ile yaşamak zorunda kalacak.
jmituzas

Var olmayan dosyaları silmesini sağlayabilirsiniz, bu tamamen iyi. Ancak kopyalamanın bir işlevi olarak, kaynağın adını değiştirirseniz, yeniden adlandırılan dosyayı kopyalar.
Evan Carroll

Sürümleri -b ile tutabilirim ve set suffix = date +%Y%m%d%k%M%Syine de alabilirim = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas

0

Bildiğim kadarıyla rsyncdosyaların yeniden adlandırılmasını tanıyamıyorum Yeni dosyaların tekrar aktarılması gerekecek. Artyom'un cevabına bakınız .

Gitmiş dosyaları silmek için, --deleteseçeneği kullandığınızdan emin olun .

Ayrıca, yansıtma için, bazı güzel seçeneklerin takma adı olan -a( arşiv ) kullanmanızı öneririm .

man 1 rsyncDetaylar için bir göz atın .


çalışacak teşekkürler --delete / mymounts / test1 / / mymounts / test2 /
jmituzas 19:13
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.