Linux Utility für "Timestamping" -Funktionalität

468
Nicholas White

Die Zeitstempel- Funktion von wget stellt sicher, dass nur geänderte Dateien heruntergeladen werden. Ich suche nach einem Linux-Befehlszeilentool, das den Inhalt eines Verzeichnisses rekursiv mit einer gespeicherten Version (vom letzten Mal, als es ausgeführt wurde) vergleicht und einen beliebigen Shell-Befehl für alle neuen oder aktualisierten Dateien ausführt. Grundsätzlich gilt:

run-on-updated --directory /path/to/my/dir --last-results ~/.lastrun --exec "echo {}" 

Ich könnte mir das sogar als Erweiterung des 'find' -Befehls vorstellen. Gibt es ein solches Werkzeug?

2
~ / .lastrun ist nur eine Datei, richtig? Keine Kopie des kompletten Verzeichnisses? Im letzteren Fall können Sie mit "rsync -v --dry-run / path / to / my / dir ~ / .lastrun" beginnen mpy vor 11 Jahren 0
Im Idealfall sollten nur die Dateimetadaten (z. B. Pfad, Größe, letzte Änderung) und keine Kopie des Verzeichnisses verwendet werden, da dies zu groß wäre. rsync hat definitiv diese Zeitstempel-Funktion - aber ich hoffe, es als eigenständiges Werkzeug zu finden (die Unix-Philosophie?) Nicholas White vor 11 Jahren 0

2 Antworten auf die Frage

3
mpy

Ein Versuch, die Frage zu beantworten - wahrscheinlich mit viel Verbesserungsbedarf:

tar -cv -f /dev/null -g ~/.lastrun /path/to/my/dir | grep -ve '/$' | xargs -I{} echo '{}' 

Hinweis für den Befehl tar: "Die Option '-g' weist tar an, in einem inkrementellen Archiv mit zusätzlichen Metadaten zu arbeiten, die in einer eigenständigen Datei gespeichert sind, die als Momentaufnahmedatei bezeichnet wird. Mit dieser Datei können Sie feststellen, welche Dateien geändert wurden. seit der letzten Sicherung hinzugefügt oder gelöscht, sodass die nächste inkrementelle Sicherung nur geänderte Dateien enthält. " (Zitat aus doc)

Der grepBefehl schließt Verzeichnisnamen aus (endet mit /), die von tar immer ausgegeben werden, und führen schließlich xargsden gewünschten Befehl für die Dateien aus.

Das funktioniert! Es aktualisiert die Datei ~ / .lastrun vor Ort, was ebenfalls nützlich ist. Nicholas White vor 11 Jahren 1
Schön, dass es für dich funktioniert. Bitte achten Sie darauf, ob es Dateinamen mit Whitespaces gibt (ich war gestern zu müde, um daran zu denken;) Wenn Sie `xargs -I {} echo '{}' verwenden, werden Sie sicherer sein. Ich habe meine Antwort entsprechend bearbeitet. mpy vor 11 Jahren 0
1
Volker Siegel

Ich bin mir nicht sicher, was Sie mit dem Satz "Vergleich eines Inhalts eines Verzeichnisses mit einer gespeicherten Version" meinen, aber um die Antwort von mpy zu tun, würde ich es vorziehen find:

Bevor Sie den findBefehl zum ersten Mal ausführen, müssen Sie den touchBefehl ausführen, um die Zeitstempeldatei zu erstellen:

touch .lastrun 

Führen Sie den touch-Befehl später nach dem Suchlauf aus:

find my/dir -type f -newer .lastrun -exec echo '{}' \; touch .lastrun 

Die Datei .lastrunwird niemals selbst aufgelistet, da sie niemals neuer als sie selbst ist.