3

У меня странное поведение на моей Linux-коробке, и я хочу твоего совета. Я хочу захватить вывод этой команды

ls -log /some/directory 

Запуск команды из командной строки, результат в порядке:

-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

поэтому мой окончательный результат с использованием 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;... 

Моя проблема появляется, когда я помещаю команду ls в скрипт Bash, потому что дата конвертируется. Вместо 2013-09-10 11:15 результат - сентябрь 09 12:02

Как я могу получить дату, как в выводе командной строки?

2 ответа2

5

Вывод ls зависит от среды LANG . Из info ls:

По умолчанию временные метки файлов перечислены в сокращенной форме. В большинстве языков используется временная метка, например 2002-03-30 23:45'. However, the default POSIX locale uses a date like 30 марта 2002 г., для не недавних временных отметок, а также дату без года и время, например, `30 марта, 23:45 'для последних временных отметок.

Сравните эти два варианта:

$ 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

Но, как всегда, плохая идея разбирать вывод ls, потому что - как вы уже видели - легко ломается. Подумайте об использовании stat вместо

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

где вы можете указать, какую временную метку вы хотите точнее:

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

И тебе больше не нужен awk .

4

Вы можете указать формат даты с помощью команды ls:

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

Это всегда приводит к одному и тому же формату даты ГГГГ-ММ-ДД.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .