Имя файла последней модификации date shell в script

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

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

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

Ответ 1

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

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

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

Изменить

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

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

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

отображает время последней модификации файла FILE

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

date -r ${MY_FILE_VARIABLE}

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

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

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

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

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, дата - время изменения файла, а остальное - имя файла.

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

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

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

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

stat -f "%Sm" ${FILE_VARIABLE}

даст вам результат, например:

Jun 26 21:28:41 2012

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

Ответ 2

имеют perl?

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

Ответ 3

Как насчет:

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

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

Ответ 4

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

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

2013-05-27

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

23:02

Ответ 5

Вы можете использовать ls -l, в котором указано время последней модификации, а затем используйте cut, чтобы вырезать дату изменения:

mod_date=$(ls -l $file_name | cut -c35-46)

Это работает в моей системе, потому что дата отображается между столбцами с 35 по 46. Возможно, вам придется играть с ней в вашей системе.

Дата находится в двух разных форматах:

  • Mmm dd hh:mm
  • Mmm dd yyyy

Файлы, измененные более года назад, будут иметь более поздний формат. Файлы, измененные менее года назад, должны будут сначала форматироваться. Вы можете найти ":" и узнать, в каком формате находится файл:

if echo "$mod_date" | grep -q ":"
then
    echo "File was modified within the year"
else
    echo "File was modified more than a year ago"
fi