it-roy-ru.com

имя файла дата последнего изменения Shell в скрипте

Я использую bash для создания сценария, в котором я получу имя файла в переменной, а затем с помощью этой переменной получим дату последнего изменения файла unix.

Мне нужно получить это значение даты модификации, и я не могу использовать команду stat.

Знаете ли вы, как получить его с помощью общедоступных команд * nix?

12
odew

Почему вы не должны использовать ls:

Разбор ls - плохая идея . Не только поведение определенных символов в именах файлов не определено и зависит от платформы, для ваших целей это будет связываться с датами, когда их прошло шесть месяцев . Короче говоря, да, это, вероятно, сработает для вас в вашем ограниченном тестировании. Он будет not независимым от платформы (поэтому не будет переносимости), и поведение вашего синтаксического анализа not не гарантируется, учитывая диапазон «допустимых» имен файлов в различных системах. (Ext4, например, разрешает пробелы и переводы строк в именах файлов ). 

Сказав все это лично, я бы использовал ls, потому что это быстро и легко;)

Правка

Как отметил Хьюго в комментариях, ОП не хочет использовать stat. Кроме того, я должен отметить, что следующий раздел специфичен для BSD-stat (флаг %Sm не работает, когда я тестирую на Ubuntu; в Linux есть команда stat, если вам интересно, прочитайте man-страницу) ). 

Итак, не -stat решение: использовать дату

date, по крайней мере в Linux, имеет флаг: -r, который в соответствии с man-страницей :

отобразить время последнего изменения файла

Итак, решение на основе сценария будет похоже на это:

date -r ${MY_FILE_VARIABLE}

который вернул бы вам нечто похожее на это:

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

Чтобы ответить на комментарий ОП: 

Если возможно с настраиваемым форматом даты

date имеет довольно обширный набор переменных формата времени; прочитайте справочную страницу для получения дополнительной информации. 

Я не уверен на 100%, насколько переносим date во всех «UNIX-подобных системах». Для BSD (например, OS X) это будет не работать; флаг -r для даты BSD делает что-то совершенно другое. Вопрос не определяет точно, насколько портативным должно быть решение. Для решения на основе BSD, см. Ниже раздел;) 

Лучшее решение - системы BSD (протестировано на OS X с использованием BSD-stat; GNU stat немного отличается, но может работать так же).

Используйте stat. Вы можете отформатировать вывод stat с флагом -f, и вы можете выбрать отображение только данных изменения файла (что для этого вопроса - Ницца). 

Например, 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

Где первый бит - это время UNIX Epoch , дата - это время изменения файла, а остальное - имя файла. 

Разбивка примера команды

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

  1. stat -f: вызов stat и укажите формат (-f). 
  2. %m: время эпохи UNIX. 
  3. %t: разделитель табуляции в выводе. 
  4. %Sm: S говорит об отображении вывода как string, m говорит об использовании данных модификации файла. 
  5. %N: Показать имя файла, о котором идет речь. 

Команда в вашем скрипте в соответствии со следующим: 

stat -f "%Sm" ${FILE_VARIABLE}

даст вам вывод, такой как:

Jun 26 21:28:41 2012

Прочитайте man-страницу для stat для получения дополнительной информации; форматирование отметки времени выполняется strftime

17
simont

есть Perl?

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

Как насчет: 

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

Смотрите страницу поиска для других значений, которые вы можете использовать с% T.

3
Alex Howansky

Вы можете использовать команду «дата», добавив желаемый вариант формата:

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

2013-05-27

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

23:02

1
user5287944