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?

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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.