ls befiehlt eine andere Ausgabe im Shell-Skript

3

Ich habe ein seltsames Verhalten in meiner Linux-Box und ich möchte Ihren Rat. Ich möchte die Ausgabe dieses Befehls erfassen

ls -log /some/directory 

Wenn Sie den Befehl von der Befehlszeile aus ausführen, ist das Ergebnis in Ordnung:

-rw-r--r--. 1 22650880 2013-09-09 12:02 file1.txt
-rwxr--r--. 1 20733952 2012-07-09 17:42 file2.txt
-rw-r--r--. 1 31596544 2013-09-09 23:42 file3.txt
-rw-r--r--. 1 15773696 2013-09-10 11:15 file4.txt

also mein Endergebnis mit awk ( ls -log /some/directory| awk '{print $6","$4" "$5}' | tr "\n" ";" ):

file1.txt,2013-09-09 12:02;file2.txt,2012-07-09 17:42;... 

Mein Problem tritt auf, wenn ich stelle ls Befehl in einem Bash-Skript, da das Datum konvertiert wird. Anstatt 2013-09-10 11:15 Das Ergebnis ist 9. September, 12:02 Uhr

Wie kann ich das Datum wie in der Befehlszeilenausgabe erhalten?

DGA
quelle

Antworten:

5

Die Ausgabe von ls abhängig von der LANG Umgebung. Von info ls:

Standardmäßig werden Dateizeitstempel in abgekürzter Form aufgeführt. Die meisten   Gebietsschemas verwenden einen Zeitstempel wie 2002-03-30 23:45'. However, the default POSIX locale uses a date like 30. März 2002 'für nicht jüngere   Zeitstempel und ein Datum ohne Jahr und Uhrzeit wie 'Mar 30 23:45' für   letzte Zeitstempel.

Vergleichen Sie diese beiden Varianten:

$ LANG=C ls -log
total 0
-rw-r--r--  1 0 Sep 10 10:34 file1
-rw-r--r--  1 0 Sep 10 10:34 file2
-rw-r--r--  1 0 Sep 10 10:34 file3
-rw-r--r--  1 0 Sep 10 10:34 file4

$ LANG=en_US.utf8 ls -log
total 0
-rw-r--r--  1 0 2013-09-10 10:34 file1
-rw-r--r--  1 0 2013-09-10 10:34 file2
-rw-r--r--  1 0 2013-09-10 10:34 file3
-rw-r--r--  1 0 2013-09-10 10:34 file4

Aber wie immer ist es ein schlechte Idee, die Ausgabe von zu analysieren ls, weil - wie Sie gesehen haben - leicht bricht. Betrachten zu verwenden stat stattdessen

for file in *; do
    stat -c "%n,%z;" "$file"
done

wo Sie angeben können, welchen Zeitstempel Sie genauer angeben möchten:

%x     Time of last access
%y     Time of last modification
%z     Time of last change

Und du brauchst nicht awk auch mehr.

mpy
quelle
Vielen Dank! Ich habe noch nie den Befehl stat verwendet. Es funktioniert für das, was ich brauche.
DGA
4

Sie können mit dem Befehl ls ein Datumsformat angeben:

ls -log --time-style="long-iso" /some/directory 

Dies ergibt immer das gleiche Datumsformat von JJJJ-MM-TT.

Rik
quelle
Vielen Dank, Ihre Antwort ist gut und streng auf meine Frage, aber die Antwort von @mpy war ausführlicher und gibt mir einen weiteren Ansatz zu meinem Problem.
DGA