ls comando output diferente no script de shell

3

Eu tenho um comportamento estranho na minha caixa Linux e quero seu conselho. Eu quero capturar a saída deste comando

ls -log /some/directory 

Rodando o comando da linha de comando, o resultado é OK:

-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

então meu resultado final usando 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;... 

Meu problema aparece quando coloco o comando ls em um script Bash, porque a data é convertida. Em vez de 2013-09-10 11:15 , o resultado é 09 de setembro 12:02

Como posso obter a data como na saída da linha de comando?

    
por DGA 10.09.2013 / 10:28

2 respostas

5

A saída de ls depende do ambiente LANG . De info ls :

By default, file timestamps are listed in abbreviated form. Most locales use a timestamp like 2002-03-30 23:45'. However, the default POSIX locale uses a date likeMar 30 2002' for non-recent timestamps, and a date-without-year and time like 'Mar 30 23:45' for recent timestamps.

Compare estas duas variantes:

$ 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

Mas, como sempre, é uma idéia ruim analisar a saída de ls , porque - como você tem visto - quebra facilmente. Considere usar stat

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

onde você pode especificar qual registro de data e hora deseja mais precisamente:

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

E você não precisa mais awk também.

    
por 10.09.2013 / 10:39
4

Você pode especificar um formato de data com seu comando ls:

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

Isso sempre resulta no mesmo formato de data de AAAA-MM-DD.

    
por 10.09.2013 / 10:40