Dateiname Datum der letzten änderung-shell-Skript
Ich bin mit der bash ein Skript erstellen, wo bekomme ich einen Dateinamen in eine variable und dann mit dieser Variablen erhalten, die Datei unix-Datum der letzten änderung.
Ich brauche, um diese änderung Datum Wert und ich kann nicht mit stat-Befehl.
Kennen Sie eine Weg, um es mit den handelsüblichen *nix-Befehle?
Wenn möglich mit einem konfigurierbaren format Datum.
Und warum kannst du nicht verwenden
stat ist nicht verfügbar in der Umgebung, die ich derzeit arbeite.
Wenn meine Antwort nicht funktioniert (
Ich brauche einen tragbaren oder robuste Lösung, ich bin in einem HP-UX system-und dieses Skript sollte laufen auch unter Linux. Kein perl auch.
Und warum kannst du nicht verwenden
stat
?stat ist nicht verfügbar in der Umgebung, die ich derzeit arbeite.
Wenn meine Antwort nicht funktioniert (
date
unterstützt nicht die -r
flag), könnten Sie mehr spezifische Plattform, die Informationen, die Sie markiert haben, mit Linux
und Unix
; stat
und date
sind beide (soweit ich weiß) ziemlich verbreitet auf den verschiedenen Linux-Distributionen, die ich begegnet bin.Ich brauche einen tragbaren oder robuste Lösung, ich bin in einem HP-UX system-und dieses Skript sollte laufen auch unter Linux. Kein perl auch.
InformationsquelleAutor odew | 2012-06-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum sollten Sie nicht verwenden
ls
:Analyse
ls
ist eine schlechte Idee. Nicht nur das Verhalten der bestimmte Zeichen in Dateinamen nicht und Plattform abhängig ist, für Ihre Zwecke, es werde Durcheinander mit Terminen, wenn Sie sechs Monate in der Vergangenheit. Kurz gesagt, ja, es wird wahrscheinlich für Sie arbeiten in Ihrem begrenzten testen. Es wird nicht werden Plattform-unabhängig (also keine Portabilität) und das Verhalten Ihrer Analyse ist nicht garantiert angesichts der Vielfalt der 'gesetzlichen' Dateinamen auf verschiedenen Systemen. (Ext4, zum Beispiel, erlaubt Leerzeichen und newlines im Dateinamen).Nachdem alles gesagt, dass, ich persönlich würde verwenden
ls
weil es schnell und einfach 😉Bearbeiten
Wie bereits von Hugo in den Kommentaren, die OP nicht möchte
stat
. Außerdem sollte ich darauf hinweisen, dass die unter Abschnitt BSD-stat-spezifische (%Sm
flag funktioniert nicht, wenn ich zum testen auf Ubuntu; Linux hat einestat
Befehl, wenn Sie interessiert sind, Lesen Sie das Manpage).So, ein nicht-
stat
Lösung: verwenden Sie Datumdate
, zumindest auf Linux, hat eine fahne:-r
, die nach dem Manpage:So, die Skript-Lösung wäre, ähnlich wie diese:
was wieder ähnlich:
Adresse die OP ' s Kommentar:
date
hat eine Recht umfangreiche Reihe von Zeit-format, Variablen, Lesen Sie die man-Seite für weitere Informationen.Bin ich mir nicht 100% sicher, wie tragbare
date
ist auf allen UNIX-wie Systeme". Für BSD-basierte (wie OS X), wird dies nicht Arbeit; die-r
flag für die BSD-Datum tut etwas völlig anderes. Die Frage ist nicht' genau angeben, wie eine tragbare Lösung gefunden werden. Für eine BSD-basierte Lösung, siehe unten 😉Eine bessere Lösung, BSD-Systemen (getestet unter OS X mit BSD-stat; GNU-stat ist etwas anders, könnte aber gemacht werden, arbeiten auf die gleiche Weise).
Verwenden
stat
. Sie können das format der Ausgabe vonstat
mit der-f
Flagge, und Sie können wählen, zeigt nur die Datei-Modifikation von Daten (die, für diese Frage, ist ganz nett).Beispielsweise
stat -f "%m%t%Sm %N" ./*
:Wo das erste bit ist das UNIX epoch time, das Datum der Dateiänderung Uhrzeit, und der rest ist der Dateiname.
Aufschlüsselung der Beispiel-Befehl
stat -f "%m%t%Sm %N" ./*
stat -f
: callstat
, und geben Sie das format (-f
).%m
: Der UNIX-Epoche Zeit.%t
: Eine Registerkarte Trennzeichen in die Ausgabe.%Sm
:S
sagt zum anzeigen der Ausgabe alsstring
,m
sagt zu der Datei, die änderung der Daten.%N
: Zeigt den Namen der Datei in Frage.Einen Befehl im Skript, die entlang der Linien der folgenden:
geben Sie eine Ausgabe wie:
Lesen Sie die Manpage für
stat
weitere Informationen; timestamp Formatierung erfolgt durchstrftime
.stat
da er diese braucht um tragbar zu jedem unix-artigen OS.date
funktioniert nicht auf BSD (getestet auf OpenBSD).stat
tut, aber funktioniert nicht auf linux.Yep. Wie bereits in der Antwort;
date
ist nicht tragbar zu BSD-Systemen, das ist, warum ich verlassen habe diestat
Abschnitt in der Antwort. Ich bin nicht sicher, es gibt eine tragbare Lösung; Antwort mitfind
ist nicht tragbar, meine BSD-Systemen, entweder mit.Sie beschweren sich, dass
ls -l
ist nicht tragbar, aberdate
ist noch weniger tragbar. Das problem ist, dass BSD-Systeme verwenden auch die-r
parameter, jedoch für unterschiedliche Zwecke. In anderen Worten, mit der-r
kann am Ende als ein Gültiger Befehl (exit-status = 0), aber nicht die Ergebnisse, die Sie wollen.Die Antwort erwähnt, dass
date
ist nicht tragbar für BSD-basierte Systeme. Mitls
ist nicht tragbar weil es ist nicht garantiert, um zu arbeiten auf jeden - Plattform. Dies steht im Gegensatz zu beidendate
undstat
welche nicht tragbar, weil die dokumentiert Umsetzung der Instrumente unterscheidet sich von Plattform zu Plattform - Sie sind zwei verschiedene tools.ls
ist die dieselbe tool mit undefinierten Verhalten für juristische Eingänge. (Habe ich sagen, ich persönlich würde verwendenls
, obwohl...) ich bin nicht davon überzeugt, es gibt eine gute, cross-Plattform-Lösung für diese Art von problem.InformationsquelleAutor simont
haben perl?
InformationsquelleAutor jm666
Wie etwa:
Finden Sie auf der manpage für die anderen Werte, die Sie verwenden können, mit %T.
-printf
ist nicht ein gültiges argument gibt es.InformationsquelleAutor Alex Howansky
Können Sie die "date" Befehl hinzufügen die gewünschte format-option format:
InformationsquelleAutor user5287944
Können Sie
ls -l
die Listen, die die Zeit der letzten Modifikation, und verwenden Sie danncut
zum Ausschneiden der änderung Datum:Diese funktioniert auf meinem system, weil das Datum erscheint zwischen den Spalten 35 bis 46. Haben Sie vielleicht spielen Sie es auf Ihrem system.
Ist das Datum in zwei verschiedenen Formaten:
Mmm dd hh:mm
Mmm dd yyyy
Dateien geändert vor mehr als einem Jahr haben, die später-format. Geänderte Dateien weniger als vor einem Jahr müssen erste-format. Suchen Sie nach einem ":" und wissen, welches format die Datei ist in:
ls
im Allgemeinen als schlechte Praxis. Während es (wahrscheinlich) funktioniert gut, es ist nicht garantiert, und kann nicht berücksichtigt werden, portablen oder robust.Und die Lösung? Sie werden angenommen, um Allgemeine shell-Skript, und mehr oder weniger standard-tools, die ich bringen Sie es zu bedeuten, dass Sie nicht verwenden können, eine scripting-Sprache wie Perl oder Python. Sie können auch nicht verwenden, stat. Mit diesen Einschränkungen gibt es nicht mehr viel, außer für die Analyse
ls
. Wie ich bereits in meinem post, es funktioniert möglicherweise nicht genau die gleiche auf dem OP-system.InformationsquelleAutor David W.