Listen Sie alle Dateien auf, die neuer als der angegebene Zeitstempel sind, und sortieren Sie sie

8

Ich möchte alle Dateien (sortiert nach Datum), die neuer als der Zeitstempel sind, 20130207003851nur 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
Radek
quelle
Was 2013007000385soll darstellen? Ich denke, 2013 ist das Jahr, aber wie kommst du vom 007000385bis zum 7. Februar?
Gilles 'SO - hör auf böse zu sein'
@ Gilles: Angeblich 20130207003851. Hat es nicht richtig kopiert oder ... Entschuldigung.
Radek

Antworten:

10

findunterstü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.

timestamp=20130207003851
timestring=${timestamp%??????}; timestamp=${timestamp#????????}
timestring="$timestring ${timestamp%????}"; timestamp=${timestamp#??}
timestring="$timestring:${timestamp%??}:${timestamp#??}"

In bash (und ksh und zsh), aber nicht in ash, können Sie das besser lesbare ${STRING_VARIABLE:OFFSET:LENGTH}Konstrukt verwenden.

timestring="${timestamp:0:8} ${timestamp:8:2}:${timestamp:10:2}:${timestamp:12:2}"

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 -printfdiese 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.%TXXX@cut -f 2-expand

find -maxdepth 1 -type f \
     -newermt "$timestring" -printf '%T@\t%f\t%Tb %Td %TH:%TM\n' |
sort -k1n |
cut -f 2- |
expand -t 40
Gilles 'SO - hör auf böse zu sein'
quelle
Nur der Find-Teil find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'gibt mir eine lustige Ausgabe-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
Radek
@Radek Sorry, es ist %Tfür die Zeit, %Mist die Berechtigungen.
Gilles 'SO - hör auf böse zu sein'
Wunderschönen. Funktioniert reibungslos. Mein letzter Code ist, dass 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.
Radek
@ Gilles es ist fantastisch, aber wenn Sie Timestring erklären, wird es mehr helfen ..
Rahul Patil
@ RahulPatil Fertig. Ich habe auch eine besser lesbare Bash-Methode hinzugefügt.
Gilles 'SO - hör auf böse zu sein'
5

Mit zsh:

zmodload zsh/stat
newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY && (( t >= timestamp ))
}
timestamp=20130207003851
print -rl -- /tmp/*(D.Om+newer)

Die newerFunktion gibt true für Dateien zurück, die neuer als sind $timestamp(beachten Sie, dass zshdie zstatGenauigkeit von Sekunden nicht unterstützt wird).

Dann verwenden wir nur noch zshGlobbing-Qualifikationsmerkmale: Punktdateien Deinschließen, .nur reguläre Dateien berücksichtigen, Omnach Änderungszeit bestellen und +newerdie newerFunktion 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:

newer() {
  local t
  zstat -A t -F %Y%m%d%H%M%S +mtime -- $REPLY &&
    REPLY+=$'\t'$t &&
    (( t >= timestamp ))
}

Beachten Sie jedoch, dass das Ergebnis der Dateinamengenerierung die Zeitstempel enthält, was bedeutet, dass Sie diese nicht mehr als Dateinamen verwenden können.

Stéphane Chazelas
quelle
Das wird sshzum Beispiel nicht funktionieren .
Evandrix