Ich möchte alle Dateien (sortiert nach Datum), die neuer als der Zeitstempel sind, 20130207003851
nur im Verzeichnis / tmp im Format auflisten. Unterverzeichnisse können weggelassen werden.
Verwenden von SUSE Linux Enterprise Server 11.
Das Ausgabeformat sollte sein
S0002948.LOG Feb 7 03:28
S0002935.LOG Feb 7 05:58
S0002952.LOG Feb 7 09:58
S0002940.LOG Feb 7 11:58
find / tmp -newermt "7 feb 2013" -ls listet die Dateien auf, die ich aber möchte
- Wie kann ich den Zeitstempel in einem Format 20130207003851 verwenden?
- Wie kann ich die Ausgabe sortieren?
- Wie kann ich nur Dateiname und Datum anzeigen? Dateiname zuerst und dann das Datum?
ps Ich möchte touch nicht verwenden, um eine Referenzdatei für die Suche zu erstellen
pss
find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
shell-script
find
ls
timestamps
Radek
quelle
quelle
2013007000385
soll darstellen? Ich denke, 2013 ist das Jahr, aber wie kommst du vom007000385
bis zum 7. Februar?20130207003851
. Hat es nicht richtig kopiert oder ... Entschuldigung.Antworten:
find
unterstützt viele Datumseingabeformate . Das einfachste Format ist JJJJMMTT HH: MM: SS. Sie haben bereits die Ziffern in der richtigen Reihenfolge. Sie müssen lediglich die erste Gruppe extrahieren (${timestamp%??????}
: alle bis auf die letzten 6 Zeichen übernehmen ;${timestamp#????????}
: alle bis auf die ersten 8 Zeichen übernehmen) und die Interpunktion und dann die nächste Gruppe anhängen wie du gehst.In bash (und ksh und zsh), aber nicht in ash, können Sie das besser lesbare
${STRING_VARIABLE:OFFSET:LENGTH}
Konstrukt verwenden.Um Dateien nach Datum zu sortieren, drucken Sie die Dateinamen aus, denen die Datumsangaben vorangestellt sind, und sortieren Sie diese. Entfernen Sie dann das Datumspräfix. Verwenden Sie
-printf
diese Option , um das Ausgabeformat zu steuern. druckt einen Teil der Änderungszeit, bestimmt durch ; Wenn ja , erhalten Sie die Anzahl der Sekunden seit der Unix-Epoche. Unten drucke ich drei durch Tabulatoren getrennte Spalten: die Zeit im sortierbaren Format, den Dateinamen und die Zeit im lesbaren Format; Entfernt die erste Spalte und den Aufruf, die Registerkarte durch genügend Leerzeichen zu ersetzen, um alle erwarteten Dateinamen aufzunehmen (passen Sie 40 wie gewünscht an). Dieser Code setzt voraus, dass Sie keine Zeilenumbrüche oder Tabulatoren in Dateinamen haben.%TX
X
X
@
cut -f 2-
expand
quelle
find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'
gibt mir eine lustige Ausgabe-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
%T
für die Zeit,%M
ist die Berechtigungen.find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-
ich Dateiname und Zeit durch getrennt habe,-
weil ich die Ausgabe in PHP erfassen und verwenden werde - als Trennzeichen. Ich danke dir sehr.Mit
zsh
:Die
newer
Funktion gibt true für Dateien zurück, die neuer als sind$timestamp
(beachten Sie, dasszsh
diezstat
Genauigkeit von Sekunden nicht unterstützt wird).Dann verwenden wir nur noch
zsh
Globbing-Qualifikationsmerkmale: PunktdateienD
einschließen,.
nur reguläre Dateien berücksichtigen,Om
nach Änderungszeit bestellen und+newer
dienewer
Funktion aufrufen , um zu bestimmen, welche Datei ausgewählt werden soll.Wenn Sie auch die Dateizeitstempel anzeigen möchten, können Sie zu Folgendem wechseln
newer
:Beachten Sie jedoch, dass das Ergebnis der Dateinamengenerierung die Zeitstempel enthält, was bedeutet, dass Sie diese nicht mehr als Dateinamen verwenden können.
quelle
ssh
zum Beispiel nicht funktionieren .