web-dev-qa-db-de.com

dateiname Datum der letzten Änderung Shell im Skript

Ich verwende bash, um ein Skript zu erstellen, in dem ich einen Dateinamen in einer Variablen erhalte und dann mit dieser Variablen das Datum der letzten Änderung der Datei unter Unix erhalte.

Ich benötige diesen Änderungsdatumswert und kann den Befehl stat nicht verwenden.

Kennen Sie eine Möglichkeit, diese mit den allgemein verfügbaren * nix-Befehlen abzurufen?

12
odew

Warum Sie ls nicht verwenden sollten:

Parsing ls ist eine schlechte Idee . Für Ihre Zwecke ist nicht nur das Verhalten bestimmter Zeichen in Dateinamen undefiniert und plattformabhängig, sondern auch Daten werden nicht berücksichtigt, wenn sie sechs Monate zurückliegen . Kurz gesagt, ja, es wird wahrscheinlich bei Ihren begrenzten Tests funktionieren. Es wird nicht plattformunabhängig sein (also keine Portabilität) und das Verhalten Ihres Parsings ist nicht garantiert angesichts des Bereichs der "legalen" Dateinamen auf verschiedenen Systemen. (Ext4 zum Beispiel erlaubt Leerzeichen und Zeilenumbrüche in Dateinamen ).

Nach all dem würde ich persönlich ls verwenden, weil es schnell und einfach ist;)

Bearbeiten

Wie Hugo in den Kommentaren betont hat, möchte das OP stat nicht verwenden. Außerdem sollte ich darauf hinweisen, dass der folgende Abschnitt BSD-stat-spezifisch ist (das %Sm -Flag funktioniert nicht, wenn ich unter Ubuntu teste; Linux hat einen stat -Befehl; falls Sie daran interessiert sind, lesen Sie den - Manpage ).

Also, eine nicht -stat Lösung: Verwenden Sie das Datum

date hat, zumindest unter Linux, ein Flag: -r, das laut man page :

anzeige der letzten Änderungszeit von FILE

Die skriptbasierte Lösung würde also ungefähr so ​​aussehen:

date -r ${MY_FILE_VARIABLE}

was Ihnen etwas ähnliches zurückgeben würde:

zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012

So sprechen Sie den Kommentar des OP an:

Wenn möglich mit einem konfigurierbaren Datumsformat

date verfügt über einen ziemlich umfangreichen Satz von Zeitformatvariablen. Lesen Sie die Manpage für weitere Informationen.

Ich bin mir nicht hundertprozentig sicher, wie portabel date auf allen "UNIX-ähnlichen Systemen" ist. Für BSD-basierte (wie OS X) funktioniert dies nicht ; Das -r Flag für das BSD-Datum macht etwas ganz anderes. Die Frage gibt nicht genau an, wie portabel eine Lösung sein muss. Für eine BSD-basierte Lösung siehe den folgenden Abschnitt;)

Eine bessere Lösung sind BSD-Systeme (getestet unter OS X mit BSD-stat; GNU stat ist etwas anders, könnte aber auf die gleiche Weise funktionieren).

Verwenden Sie stat. Sie können die Ausgabe von stat mit dem Flag -f formatieren und festlegen, dass nur die Dateiänderungsdaten angezeigt werden (bei dieser Frage handelt es sich um Nice).

Zum Beispiel stat -f "%m%t%Sm %N" ./*:


1340738054  Jun 26 21:14:14 2012 ./build
1340738921  Jun 26 21:28:41 2012 ./build.xml
1340738140  Jun 26 21:15:40 2012 ./lib
1340657124  Jun 25 22:45:24 2012 ./tests

Wenn das erste Bit die NIX-Epochenzeit ist, ist das Datum die Dateiänderungszeit und der Rest der Dateiname.

Aufschlüsselung des Beispielbefehls

stat -f "%m%t%Sm %N" ./*

  1. stat -f: Rufen Sie stat auf und geben Sie das Format an (-f).
  2. %m: Die UNIX-Epochenzeit.
  3. %t: Ein Tabulator-Trennzeichen in der Ausgabe.
  4. %Sm: S sagt, dass die Ausgabe als string angezeigt werden soll, m sagt, dass die Dateiänderungsdaten verwendet werden sollen.
  5. %N: Zeigt den Namen der betreffenden Datei an.

Ein Befehl in Ihrem Skript wie folgt:

stat -f "%Sm" ${FILE_VARIABLE}

sie erhalten folgende Ausgabe:

Jun 26 21:28:41 2012

Lesen Sie die Manpage für stat für weitere Informationen; Die Formatierung des Zeitstempels erfolgt durch strftime .

17
simont

perl haben?

Perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
4
jm666

Wie wäre es mit:

find $PATH -maxdepth 1 -name $FILE -printf %Tc

Weitere Werte, die Sie mit% T verwenden können, finden Sie auf der Hilfeseite zum Suchen.

3
Alex Howansky

Sie können den Befehl "Datum" verwenden und die gewünschte Formatoption zum Format hinzufügen:

 date +%Y-%m-%d -r /root/foo.txt

2013-05-27

 date +%H:%M -r /root/foo.txt

23.02

1
user5287944