Wie erhalte ich die neueste Datei aus einer Liste von Dateien in einem bestimmten Verzeichnis [geschlossen]

8

Ich muss die neueste Datei aus einer Liste von Dateien in einem bestimmten Verzeichnis abrufen.

Wenn ich das Skript zum ersten Mal ausführe, habe ich die Liste der Dateien in einem bestimmten Verzeichnis in ein anderes Verzeichnis kopiert.

Ab dem zweiten Durchlauf muss ich die neuesten Dateien aus einer Liste von Dateien im selben Verzeichnis abrufen, um diese Dateien in das andere Verzeichnis zu kopieren.

Hier im ersten Durchlauf erfasse ich das Erstellungsdatum der letzten Datei in einer Variablen, wenn das Skript ein zweites Mal ausgeführt wird, Dateien, die größer sind als das Erstellungsdatum der letzten Datei im ersten Durchlauf. Diese Dateien müssen in das andere Verzeichnis kopiert werden.

Könnte mir bitte jemand helfen, die neuesten Dateien zu bekommen?

Abbireddy
quelle
Sie sollten Ihre Absicht klarstellen. Wenn Sie nur die beiden Ordner synchronisieren möchten, sind die Schritte, nach denen Sie fragen, nicht der beste Ansatz.
Julie Pelletier

Antworten:

22
ls -t1 |  head -n 1

Der erste listet alle nach Zugriffszeit geordneten Dateien auf, der zweite wählt die erste Zeile aus.

Thomas Stuefe
quelle
4

In zsh ist die neueste Datei im aktuellen Verzeichnis

a=(*(om[1]))
latest_file=$a[1]
cp -p $latest_file /other/directory

( Glob-Qualifikatoren rocken, aber leider ist das Ergebnis immer noch eine Liste, selbst wenn Sie nur ein Element anfordern, daher das temporäre Array a.)

In anderen Shells können Sie Folgendes verwenden, wenn Sie wissen, dass Ihre Dateinamen keine Zeilenumbrüche oder nicht druckbaren Zeichen enthalten dürfen ls:

latest_file=$(ls -t | head -n 1)
cp -p "$latest_file" /other/directory

Es scheint jedoch, dass Sie wirklich nach der Liste der Dateien fragen, die neuer als eine bestimmte Datei sind. Zu diesem -cnewerZweck können Sie das integrierte von verwenden find, um Dateien zu erkennen, deren Inhalt oder Metadaten sich in letzter Zeit geändert haben als einige andere Dateien. Beachten Sie, dass die Art und Weise, wie ich es hier aufrufe, findauch Dateien in Unterverzeichnissen sammelt.

find . -cnewer "$previous_latest_files" -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +

Das Problem besteht weiterhin darin, die letzte Datei zu erkennen. Entscheidend ist das Datum der Kopie. Erstellen Sie also beim Kopieren eine Markierungsdatei.

find . -cnewer marker_file -exec sh -c 'cp -p "$@" "$0"' /other/directory {} +
touch marker_file

Wenn die Dateien im Zielverzeichnis verbleiben, können Sie die beiden Verzeichnisse einfach synchronisieren. Beachten Sie, dass wenn Sie einige alte Dateien aus dem Zielverzeichnis löschen, diese jedoch im Quellverzeichnis verbleiben, diese mit dieser Methode erneut kopiert werden.

rsync -a . /other/directory/
Gilles 'SO - hör auf böse zu sein'
quelle
4

Wenn Sie nur Dateien basierend auf ihren Änderungszeiten von einem Verzeichnis in ein anderes kopieren, sollten Sie dies in Betracht ziehen rsync. Ein sehr einfacher Weg, dies zu tun, könnte sein:

rsync -t ./dir1/ ./dir2/

Oder nur um zu sehen, was es hinzufügen würde:

rsync -t --list-only ./dir1/ ./dir2/

Wie Gilles in einem Kommentar unten bemerkt, kann es mildernde Umstände geben, die die Verwendung der -tOption für Sie verhindern. Aber wenn Sie etwas wegnehmen diese es zulassen, dass Sie kann und testen sollten für die Ergebnisse , die Sie wünschen und dass rsync‚s --list-onlyOption ist ein sehr einfaches Mittel, dies zu tun.

Vielleicht auch ...

man rsync
mikeserv
quelle
Vorsichtsmaßnahme: Wenn Dateien aus gelöscht werden, dir2aber nicht dir1, werden sie erneut kopiert. Die Frage enthält nicht genügend Informationen, um zu wissen, ob es sich um ein Problem handelt.
Gilles 'SO - hör auf böse zu sein'
@ Gilles: Stimmt. tarkönnte in diesem Fall genutzt werden. rsyncselbst bietet außerdem so viele zusätzliche Synchronisierungspunkte, wie Sie sich wünschen können. Dennoch enthält die Frage sicherlich nicht genügend Daten, um zu wissen, dass dies der Fall ist. Ich löse zu oft Probleme, die nicht da sind - wenn ich sie nicht verursache - aber diesmal habe ich es nicht getan.
Mikeserv
3

Wenn Ihr eigentliches Ziel darin besteht, eine Reihe von Dateien basierend auf der Änderungszeit zu verschieben und die Version Ihres Systems finddie -newerXYArt der Tests unterstützt, können Sie so etwas tun

find -type f -newermt "@$lasttime" -exec mv -t path/to/destination/ {} +

Wo $lasttimeist die Zeit für die Dateimodifikation, die Sie zuvor gespeichert haben, in Sekunden seit der Epoche (z. B. wie von stat -c %Y yourfile).

Sie können die Änderungszeiten auch direkt mit denen einer Referenzdatei verwenden find -newer somefileoder find -newermm somefilevergleichen, anstatt den Zeitstempel der Referenzdatei in einer Variablen zu speichern.

Um die Auswahl auf das aktuelle Verzeichnis zu beschränken (Unterverzeichnisse ausschließen), können Sie -maxdepth 1dem findBefehl hinzufügen .

Steeldriver
quelle