Ich arbeite an einem LRU-Skript, habe aber nach 20 Stunden Arbeit ein Problem mit dem rekursiven Modus, das ich nicht beheben kann.
Ich brauche nur einen Befehl, der mir nach Zugriffszeit sortierte Dateien anzeigt (--time=atime); ich möchte auch die Tiefe verwalten, aber wenn das nicht geht, ist das auch in Ordnung.
- Hauptverzeichnis:
- Datei 1
- Verzeichnis 1:
- Datei 1
- Datei2
- Unterverzeichnis 1:
- Datei1
- Datei 2
- Verzeichnis 2:
- Datei 1
- Datei 2
- Unterverzeichnis 2:
- Datei 1
- Datei 2
- Unterverzeichnis 3:
- Datei 1
Ich möchte das Verzeichnis ausschließen und die Dateien nur nach Zugriffszeit sortieren lassen
wie
/Hauptverzeichnis/Verzeichnis 1/Datei 1
/Hauptverzeichnis/Datei 1
/Hauptverzeichnis/Verzeichnis 1/Unterverzeichnis 1/Datei 2
/Hauptverzeichnis/Verzeichnis 2/Unterverzeichnis 2/Unterverzeichnis 3/Datei 1
usw..
Antwort1
Es gibt sechs sehr häufig verwendete Tools zur Lösung ähnlicher Probleme:
find
, um nach Dateien oder Verzeichnissen zu suchen, die bestimmten Einträgen entsprechen.Die Optionen
-mindepth
und-maxdepth
steuern, wie tief im Dateisystembaum (relativ zu den angegebenen Namen, die sich immer auf der Tiefe 0 befinden) der Befehl arbeitet.Die
-type
Option ist nützlich, um die Berücksichtigung auf Dateien, Verzeichnisse, symbolische Links oder Geräte zu beschränken.Diese
-printf
Option ist äußerst nützlich, da sie den Befehl veranlasst, die Informationen zu den übereinstimmenden Namen (Verzeichniselementen) im gewünschten Format auszudrucken. Besonders gut gefällt mir%TY%Tm%Td %TT %p\n
, das Datum und Uhrzeit der letzten Änderung sowie den vollständigen Pfad und Namen jeder Übereinstimmung in jeder Zeile im Format ausgibtYYYYMMDD HH:MM:SS.sss PATH
. Dieses Format sortiert nämlich richtig. Verwenden Sie für den letzten Zugriff ,%AY%Am%Ad %AT %p\n
beachten Sie jedoch, dass Zugriffszeitstempel überhaupt nicht aufgezeichnet werden, wennnoatime
die Mount-Option verwendet wird, oder dass beirelatime
Verwendung der Mount-Option Zugriffszeitstempel nur für den ersten Zugriff nach einer Änderung geändert werden; die Prüfung auf zuletzt verwendete Datei ist daher nicht zuverlässig. (Die Liste der zuletzt geänderten Dateien ist jedoch ziemlich zuverlässig; die Benutzer können die Zeitstempel manuell ändern, ansonsten werden sie jedoch automatisch verwaltet.)sort
um die Ausgabe zu sortieren.Die Optionen
-d
,-g
,-h
,-M
, und-n
definieren, wie Elemente verglichen werden, und die-R
Option legt die Reihenfolge nach dem Zufallsprinzip fest.Mit dieser
-r
Option kann die Sortierreihenfolge umgekehrt werden (zusätzlich zu einer der obigen Optionen).Die
-t
Option definiert neu, wie Felder (Spalten) definiert werden; standardmäßig werden Spalten durch Leerzeichen (Leerzeichen und Tabulatoren) getrennt.Mit der
-k
Option kann festgelegt werden, welcher Teil jeder Zeile als Sortierschlüssel betrachtet wird, standardmäßig wird die gesamte Zeile berücksichtigt.uniq
wird häufig nach dem Sortieren verwendet, um mehrere aufeinanderfolgende Elemente zu einem zusammenzufassen, sodass nur die eindeutigen Zeilen ausgegeben werden.cut
ist die einfachste Möglichkeit, aus jeder Zeile der Ausgabe nur bestimmte Spalten auszuwählen.Mit dieser
-f
Option können Sie die zu druckenden Felder auswählen. (Standardmäßig werden Zeilen mit höchstens einem Feld (ohne Trennzeichen) gedruckt. Mit dieser Option-s
können Sie das Drucken solcher Zeilen unterdrücken.)Mit der
-d
Option lässt sich die Definition eines Feldes neu festlegen, standardmäßig werden Felder durch Leerzeichen getrennt.sed
ist ein leistungsstarker Stream-Editor, derReguläre Ausdrückeauf die Eingabe, um sie nach Bedarf zu filtern und zu ändern.awk
ist ein Interpreter für die Sprache awk. Awk-Skripte sind im Grunde Sammlungen vonAktionen, Code-Schnipsel, die für jede Zeile ausgeführt werden (oder vor oder nach der gesamten Verarbeitung oder wenn die Zeile (oder der Datensatz) einer bestimmten Regel entspricht).
Dieses spezielle Problem kann durch die Verwendung von drei der oben genannten Befehle in einer einfachen Pipeline gelöst werden: Verwenden Sie , find
um Dateien in den gewünschten Tiefen des Baums zu finden, und drucken Sie für jede Datei ein sortierbares Datum und eine sortierbare Uhrzeit sowie den relativen Pfad zur Datei. Sortieren Sie die Ausgabe. Entfernen Sie den Datums- und Uhrzeitteil jeder Zeile, sodass in jeder Zeile nur der relative Pfad zu jeder Datei übrig bleibt.
Antwort2
Die mit Abstand einfachste Methode ist die Verwendungzsh. Es istGlob-Qualifikationkann Dateien anhand ihres Typs, Zeitstempels und anderer Eigenschaften zuordnen und sortieren.
print -lr -- *(.Doa)
print -lr -- **/*(.Doa)
Der erste Befehl gibt die Namen der regulären Dateien ( .
) im aktuellen Verzeichnis aus, einschließlich der Punktdateien ( D
), sortiert nach Zugriffszeit ( oa
). Der zweite Befehl listet Dateien im aktuellen Verzeichnis und in seinen Unterverzeichnissen rekursiv auf.