Używanie rsync do usuwania tylko obcych plików

13

Jaki jest najlepszy sposób porównywania dwóch struktur katalogów i usuwania obcych plików i katalogów w lokalizacji docelowej?

Mam małą internetową galerię zdjęć, którą opracowuję. Użytkownicy dodają i usuwają obrazy za pomocą FTP. Oprogramowanie galerii internetowej, które napisałem, tworzy nowe miniatury w locie, ale nie zajmuje się usuwaniem. Chciałbym zaplanować skrypt poleceń / bash, który zajmie się tym w określonych odstępach czasu.

Oryginalne obrazy są przechowywane /home/gallery/images/i są uporządkowane w albumach przy użyciu podkatalogów. Miniatury są buforowane /home/gallery/thumbs/przy użyciu tej samej struktury katalogów i nazw plików, co katalog obrazów.

Próbowałem użyć tego, aby to osiągnąć:

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

co działałoby dobrze, gdyby wszystkie miniatury zostały już zapisane w pamięci podręcznej, ale nie ma gwarancji, że tak się stanie, gdy tak się stanie, katalog thumb ma skopiowane oryginalne obrazy w pełnym rozmiarze.

Jak najlepiej osiągnąć to, co próbuję zrobić?

Bryan
źródło

Odpowiedzi:

8

Nie wydaje mi się, żeby rsyncto było najlepsze podejście. Chciałbym użyć bash one-liner, jak poniżej:

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

Jeśli ten linijka tworzy odpowiednią listę plików, możesz ją zmodyfikować, aby uruchomić rmpolecenie zamiast echopolecenia.

Tom Shaw
źródło
Dzięki Tom. Chyba też wyczyściłem katalogi, musiałbym uruchomić go po raz drugi, ale określając katalogi w poleceniach zamiast plików i zastępując echo rmdir?
Bryan
@Bryan: Tak, to brzmi rozsądnie. Trzeba będzie zmienić flagi w findi podczas [testu ]. Oczywiście, bądź bardzo ostrożny zarówno z poleceniem, które ci dałem, jak i wszelkimi modyfikacjami, i dokładnie przetestuj echo!
Tom Shaw
Wielkie dzięki, zastosuję duże ilości echa podczas testowania.
Bryan
1
Właśnie pomyślałem: możesz również przetestować za pomocą „ls”, aby upewnić się, że działa dobrze z białymi spacjami. Wszystkiego najlepszego.
Tom Shaw
34

Potrzebujesz --existingrównież:

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

Z strony podręcznika:

  --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).
Joril
źródło
1
Jeśli w ogóle są jakieś błędy, Twoja niesamowita odpowiedź nie zadziała. Dlatego musisz również dodać --ignore-errorsargument. To jedyna rzecz, która działała dla mnie. Dziękuję za --existingi --ignore-existing! Użyłem twojej odpowiedzi jako podstawy mojej odpowiedzi tutaj .
LonnieBest
1
@LonnieBest Jeśli są błędy, ani nawet rm, cpczy mvbędzie działać jak to jakie błędy są: Są to problemy, które powinny zostać przeanalizowane i operacje, które uniemożliwiają ukończenie udany. Możesz poinstruować większość narzędzi, aby ignorowały błędy (np. W -fprzypadku rm), ale nie widzę, jak ma to znaczenie dla pytania lub tej odpowiedzi.
Mecki