Verwenden von rsync, um nur nicht benötigte Dateien zu löschen

13

Wie lassen sich zwei Verzeichnisstrukturen am besten vergleichen und nicht benötigte Dateien und Verzeichnisse am Zielspeicherort löschen?

Ich habe eine kleine Web-Fotogalerie-App, die ich entwickle. Benutzer können Bilder über FTP hinzufügen und entfernen. Die von mir geschriebene Webgalerie-Software erstellt neue Miniaturansichten im Handumdrehen, behandelt jedoch keine Löschvorgänge. Was ich tun möchte, ist ein Befehl / Bash-Skript zu planen, um dies in vordefinierten Intervallen zu erledigen.

Originalbilder werden /home/gallery/images/in Alben gespeichert und in Unterverzeichnissen organisiert. Die Miniaturansichten werden /home/gallery/thumbs/mit derselben Verzeichnisstruktur und denselben Dateinamen wie das Bilderverzeichnis zwischengespeichert.

Ich habe Folgendes versucht, um dies zu erreichen:

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

Das würde gut funktionieren, wenn alle Thumbnails bereits zwischengespeichert worden wären. Es gibt jedoch keine Garantie dafür, dass dies der Fall wäre. In diesem Fall werden im Thumb-Verzeichnis Originalbilder in voller Größe kopiert.

Wie kann ich am besten erreichen, was ich versuche zu tun?

Bryan
quelle

Antworten:

8

Ich denke nicht, dass dies rsyncder beste Ansatz ist. Ich würde einen Bash-Einzeiler wie den folgenden verwenden:

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

Wenn dieser Einzeiler die richtige Liste von Dateien erstellt, können Sie sie so ändern, dass ein rmBefehl anstelle eines echoBefehls ausgeführt wird.

Tom Shaw
quelle
Vielen Dank, Tom. Ich denke, um auch die Verzeichnisse zu bereinigen, müsste ich es ein zweites Mal ausführen, aber Verzeichnisse in den Befehlen anstelle von Dateien angeben und das Echo durch ersetzen rmdir?
Bryan
@ Bryan: Ja, das klingt vernünftig. Sie müssten die Flags im findund im [Test ändern ]. Seien Sie natürlich sowohl mit dem Befehl, den ich Ihnen gegeben habe, als auch mit Änderungen sehr vorsichtig und testen Sie gründlich mit echo!
Tom Shaw
Vielen Dank, ich werde beim Testen reichlich Echo aufbringen.
Bryan
1
Hatte gerade einen Gedanken: Sie können auch mit "ls" testen, um sicherzustellen, dass es auch mit Leerzeichen funktioniert. Die besten Wünsche.
Tom Shaw
34

Du brauchst --existingauch:

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

Aus der Manpage:

  --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
quelle
1
Wenn es überhaupt irgendwelche Fehler gibt, wird deine großartige Antwort nicht funktionieren. Deshalb müssen Sie auch das --ignore-errorsArgument hinzufügen . Das ist das einzige, was bei mir funktioniert hat. Danke für --existingund --ignore-existing! Ich habe Ihre Antwort als Grundlage für meine Antwort hier verwendet .
LonnieBest
Wenn es @LonnieBest Fehler vorhanden sind, nicht einmal rm, cpoder mvwird wie das ist , arbeiten , was Fehler sind: Sie sind Probleme , die betrachtet werden sollten und die verhindern , dass Operationen von dem Abschließen erfolgreich. Sie können die meisten Tools anweisen, Fehler zu ignorieren (z. B. -ffür rm), aber ich sehe keine Relevanz für die Frage oder diese Antwort.
Mecki