Yalnızca yabancı dosyaları silmek için rsync kullanma


13

İki dizin yapısını karşılaştırmanın ve hedef konumdaki yabancı dosya ve dizinleri silmenin en iyi yolu nedir?

Geliştirdiğim küçük bir web fotoğraf galerisi uygulamam var. Kullanıcılar FTP kullanarak görüntü ekler ve kaldırır. Yazdığım web galerisi yazılımı anında yeni küçük resimler oluşturuyor, ancak silme işlemleriyle ilgilenmiyor. Ne yapmak istiyorum, önceden tanımlanmış aralıklarla ilgilenmek için bir komut / bash komut dosyası zamanlama olduğunu.

Orijinal görüntüler /home/gallery/images/alt dizinler kullanılarak albümlerde saklanır ve düzenlenir. Küçük resimler, resim /home/gallery/thumbs/dizini ile aynı dizin yapısı ve dosya adları kullanılarak önbelleğe alınır .

Bunu başarmak için aşağıdakileri kullanmayı denedim:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

bu, tüm küçük resimler zaten önbelleğe alınmışsa iyi çalışır, ancak durumun böyle olacağının garantisi yoktur, bu olduğunda, başparmak dizininin kopyalanmış orijinal tam boyutlu görüntüleri vardır.

Yapmaya çalıştığım şeyi en iyi nasıl elde edebilirim?

Yanıtlar:


8

Bunun rsynciçin en iyi yaklaşım olduğunu düşünmüyorum . Ben aşağıdaki gibi bash bir astar kullanabilirsiniz:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

Bu tek astar doğru dosya listesini üretirse, rmkomut yerine komut çalıştırmak üzere değiştirebilirsiniz echo.


Teşekkürler Tom. Ben de dizinleri temizlemek için sanırım, ben ikinci kez çalıştırmak gerekir, ama dosyaları yerine komutları dizinleri belirtmek ve yankı yerine rmdir?
Bryan

@Bryan: Evet, kulağa makul geliyor. Testteki findve [testteki bayrakları değiştirmeniz gerekir ]. Tabii ki, lütfen size verdiğim komutla ve değişikliklerle çok dikkatli olun ve iyice test edin echo!
Tom Shaw

Çok teşekkürler, test ederken bol miktarda yankı uygulayacağım.
Bryan

1
Sadece bir düşünce vardı: beyaz boşluk ile iyi çalıştığından emin olmak için de "ls" ile test edebilirsiniz. En iyi dileklerimle.
Tom Shaw

34

Siz de ihtiyacınız var --existing:

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

Manpage'den:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
Herhangi bir hata varsa, harika cevabınız işe yaramaz. Bu yüzden --ignore-errorsargümanı da eklemeniz gerekiyor . Benim için işe yarayan tek şey bu. İçin teşekkür ederim --existingve --ignore-existing! Cevabınızı burada cevabımın temeli olarak kullandım .
LonnieBest

1
Hatalar, hatta varsa @LonnieBest rm, cpya mvhatalardır ne anlama yıllardan olarak çalışacaktır: Onlar bakmak gerekir ve başarılı tamamlanmasını çalışmasına engel olduğunu sorunlardır. Çoğu aracın hataları (ör. -fİçin rm) yoksayması talimatını verebilirsiniz, ancak bunun soru veya bu yanıtla ne kadar alakalı olduğunu göremiyorum.
Mecki
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.