Ich habe eine Datei mit YYYYMMDD
dem Namen im Dateinamen, wie z
file-name-20151002.txt
Ich möchte feststellen, ob diese Datei nach dem 02.10.2015 geändert wurde.
Anmerkungen:
- Ich kann dies tun, indem ich mir die Ausgabe von
ls
ansehe, aber ich weiß, dass das Parsen der Ausgabe vonls
eine schlechte Idee ist. - Ich muss nicht alle Dateien finden , die nach einem bestimmten Datum datiert sind, sondern muss jeweils nur eine bestimmte Datei testen .
- Ich bin nicht besorgt darüber, dass die Datei am selben Datum geändert wird, nachdem ich sie erstellt habe. Das heißt, ich möchte nur wissen, ob diese Datei mit
20151002
dem Namen am 03. Oktober 2015 oder später geändert wurde. - Ich bin auf MacOs 10.9.5.
bash
files
osx
timestamps
Peter Grill
quelle
quelle
Antworten:
Hier sind einige Möglichkeiten mit:
OSX stat
::GNU date
::zsh
nur:Verwendung:
Beispielausgabe:
oder
quelle
Das folgende Skript überprüft die Daten aller in der Befehlszeile angegebenen Dateien:
Es erfordert GNU - Versionen
sed
,date
undstat
Hier ist eine Version, die nicht getestet wurde, aber auf Macs (und unter FreeBSD usw.) funktionieren sollte, wenn ich die Online-Manpages richtig gelesen habe:
quelle
sed: illegal option -- r
bekomme mit MacOS 10.9.5.-r
ist eine GNU-sed
Option, mit der angewiesen wird, erweiterte reguläre Ausdrücke zu verwenden. Sie könnten das sed-Skript so ändern, dass es einen einfachen regulären Ausdruck anstelle eines erweiterten Skripts verwendet (z. B.sed -e 's/^.*\(2015\)/\1/')
aber der Rest des Skripts wird wahrscheinlich immer noch fehlschlagen, da die GNU-Versionen vondate
und erforderlich sindstat
, und ich glaube nicht, dass Macs standardmäßig mit ihnen geliefert werden (obwohl dies der Fall ist) verfügbar für Mac in vorkompilierten Paketen)Verwenden Sie bash und
stat
undexpr
, um die Daten als Zahlen abzurufen und zu vergleichen:Dies war meine frühere Linux-spezifische Antwort.
Der Bash-
=~
Regexp-Operator erfasst die 8 Ziffern des Dateinamens im Bash-Array BASH_REMATCH.[[ ]]
vergleicht die Zeichenfolgen, obwohl Sie sie stattdessen einfach als Zahlen in vergleichen[ -gt ]
.quelle
-c
Option dazu zu habenstat
.stat -f %m -t %F "$file"
. Entschuldigung, ich kann es nicht testen.stat
gemäß Ihrem Kommentar scheinen die Dinge ausgeführt zu werden, aber keine Ausgabe für alle Testfälle. Aber was macht das"$file" =~ ([0-9]{8}).txt$
?.txt
Ende des Dateinamens. Die Klammern()
erfassen den 8-stelligen Teil und finden ihn in${BASH_REMATCH[1]}
.if [[=~]]
Ihnen kann den Grund versuchenif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
und ersetzen Sie dann${BASH_REMATCH[1]}
durch$filedate
.Sie könnten dies tun:
touch
Befehl (Hinzufügen von 0 für Stunde / Minute / Sekunde), um das Änderungsdatum für die temporäre Datei festzulegenDa es sich bei Ihrer Frage um handelt
bash
, verwenden Sie wahrscheinlich Linux. Dastest
unter Linux verwendete Programm (Teil von coreutils ) verfügt über Erweiterungen für den Zeitstempelvergleich (-nt
und-ot
), die in POSIXtest
nicht gefunden wurden .POSIX kommentiert dies in der Begründung für
test
:Mit dieser Erweiterung könnten Sie dann
-nt
Operator intest
, um den gewünschten Vergleich durchzuführen.Hier ist ein Beispiel. Eine Klarstellung von OP erwähnte die Plattform, so dass man sie
stat
als Alternative zu temporären Dateien verwenden könnte (vergleiche OSX und Linux ):quelle
trap
Befehl zu entfernen .Ein anderer
zsh
Ansatz:Würde die Dateien melden, deren Name wie ein Zeitstempel aussieht, der aber nicht ihrer letzten Änderungszeit entspricht.
zsh
hat eine Vielzahl solcher Operatoren, um Globs und Variablen zu manipulieren. Es ist sehr praktisch, um jede Arbeit schnell (und im Allgemeinen zuverlässig) zu erledigen, aber es ist ziemlich schwierig, sich mit allen vertraut zu machen, und es wird häufig das erzeugt, was wir normalerweise als schreibgeschützten Code bezeichnen (Euphemismus für unleserlichen Code, impliziert aber auch, dass Sie dies nicht tun). Sie müssen es nicht lesen, während Sie es für eine einzelne Verwendung an der Eingabeaufforderung schreiben.Ein kurzer Durchlauf:
**/pattern(qualifier)
: rekursiver Glob mit Glob-Qualifier.[0-9](#c8)
entspricht 8 Ziffern. Das ist das zsh Extendedglob-Äquivalent vonksh
's{8}([0-9])
.D
: versteckte Dateien einschließene@...@
: das eval glob-Qualifikationsmerkmal, um Text auszuführen und Dateien weiter zu qualifizieren. Dateipfad übergeben$REPLY
zstat...
Rufen Sie die im$m
Array als JJJJMMTT formatierte Zeit ab .${REPLY:t}
: Erweitert sich zum t -Ende (dem Basisnamen) der Datei.${(SM)something#pattern}
. Extrahieren des Teils passenden Muster von etwas . DiejenigenS
( S ubstring Suche) undM
( erweitern , um M atched Teil) werden als Parameter Expansion Flags .quelle