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?
quelle
Antworten:
Der erste listet alle nach Zugriffszeit geordneten Dateien auf, der zweite wählt die erste Zeile aus.
quelle
In zsh ist die neueste Datei im aktuellen Verzeichnis
( 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
:Es scheint jedoch, dass Sie wirklich nach der Liste der Dateien fragen, die neuer als eine bestimmte Datei sind. Zu diesem
-cnewer
Zweck können Sie das integrierte von verwendenfind
, 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,find
auch Dateien in Unterverzeichnissen sammelt.Das Problem besteht weiterhin darin, die letzte Datei zu erkennen. Entscheidend ist das Datum der Kopie. Erstellen Sie also beim Kopieren eine Markierungsdatei.
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.
quelle
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:Oder nur um zu sehen, was es hinzufügen würde:
Wie Gilles in einem Kommentar unten bemerkt, kann es mildernde Umstände geben, die die Verwendung der
-t
Option 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 dassrsync
‚s--list-only
Option ist ein sehr einfaches Mittel, dies zu tun.Vielleicht auch ...
quelle
dir2
aber nichtdir1
, werden sie erneut kopiert. Die Frage enthält nicht genügend Informationen, um zu wissen, ob es sich um ein Problem handelt.tar
könnte in diesem Fall genutzt werden.rsync
selbst 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.Wenn Ihr eigentliches Ziel darin besteht, eine Reihe von Dateien basierend auf der Änderungszeit zu verschieben und die Version Ihres Systems
find
die-newerXY
Art der Tests unterstützt, können Sie so etwas tunWo
$lasttime
ist die Zeit für die Dateimodifikation, die Sie zuvor gespeichert haben, in Sekunden seit der Epoche (z. B. wie vonstat -c %Y yourfile
).Sie können die Änderungszeiten auch direkt mit denen einer Referenzdatei verwenden
find -newer somefile
oderfind -newermm somefile
vergleichen, 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 1
demfind
Befehl hinzufügen .quelle