У меня есть файлы с именем YYYYMMDD
в имени файла, например,
file-name-20151002.txt
Я хочу определить, был ли этот файл изменен после 2015-10-02.
Заметки:
- Я могу сделать это, посмотрев на вывод
ls
, но я знаю, что разбор выходных данныхls
- плохая идея. - Мне не нужно находить все файлы, датированные после определенной даты, просто нужно проверять один конкретный файл за раз.
- Меня не беспокоит изменение файла в тот же день после его создания. То есть я просто хочу знать, был ли этот файл с
20151002
именем изменен 03 октября 2015 года или позже. - Я на MacOs 10.9.5.
bash
files
osx
timestamps
Питер Гриль
источник
источник
Ответы:
Вот несколько возможных способов:
OSX stat
:GNU date
:zsh
только:Использование:
Пример вывода:
или
источник
Следующий скрипт проверит даты всех файлов, указанных в командной строке:
Требуются версии GNU
sed
,date
иstat
Вот версия, которая не тестировалась, но должна работать на Mac (и на FreeBSD и т. Д.), Если я правильно прочитал справочные страницы в Интернете:
источник
sed: illegal option -- r
с MacOS 10.9.5.-r
являетсяsed
опцией GNU, чтобы сказать ей использовать расширенные регулярные выражения. Вы могли бы изменить сценарий sed, чтобы использовать базовое регулярное выражение, а не расширенное (например,sed -e 's/^.*\(2015\)/\1/')
но остальная часть сценария, вероятно, все равно потерпит неудачу, потому что для этого требуются версии GNUdate
иstat
, и я не думаю, что Mac поставляются с ними как стандартные (хотя они для Mac в предварительно скомпилированных пакетов)Используя bash и
stat
и,expr
чтобы получить даты в виде чисел и сравнить их:Это был мой предыдущий специфичный для Linux ответ.
Оператор
=~
регулярного выражения bash записывает 8 цифр имени файла в массив bash BASH_REMATCH.[[ ]]
сравнивает строки, хотя вы просто сравнить их как числа , а не в[ -gt ]
.источник
-c
возможностиstat
.stat -f %m -t %F "$file"
. Извините, я не могу это проверить.stat
с вашим комментарием вещи, кажется, выполняются, но не выводятся для всех тестовых случаев. Но что"$file" =~ ([0-9]{8}).txt$
делать?.txt
конец имени файла. В скобках()
указана 8-значная часть, и вы можете найти ее в${BASH_REMATCH[1]}
.if [[=~]]
вами, вы можете попробовать базовый,if filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
а затем заменить${BASH_REMATCH[1]}
на$filedate
.Вы могли бы сделать это:
touch
команду (добавляя 0 для часа / минуты / секунды), чтобы установить дату изменения временного файлаПоскольку ваш вопрос о
bash
, вы, вероятно, используете Linux.test
Программа , используемая в Linux (часть Coreutils ) имеет расширение для сравнения временных меток (-nt
и-ot
) не найден в стандарте POSIXtest
.POSIX комментирует это в обосновании
test
:Используя это расширение, вы можете затем
-nt
оператор в,test
чтобы сделать сравнение, которое вы просили.Вот пример. В пояснениях OP упоминается платформа, поэтому можно использовать ее
stat
как альтернативу временным файлам (сравните OSX и Linux ):источник
trap
команды.Другой
zsh
подход:Сообщать о файлах, которые имеют что-то, что выглядит как отметка времени в их имени, но не соответствует их времени последнего изменения.
zsh
имеет множество таких операторов для управления глобусами и переменными. Очень удобно выполнять любую работу быстро (и, как правило, надежно), но довольно сложно разобраться со всеми из них, и часто получается то, что мы обычно называем кодом только для записи (эвфемизм для неразборчивого кода, хотя также подразумевает, что вы не не нужно читать, как вы пишете для однократного использования в командной строке)Быстрый пробег через:
**/pattern(qualifier)
: рекурсивный глобус с классификатором глобуса.[0-9](#c8)
соответствует 8 цифрам. Это zsh extendedglob-эквивалентksh
's{8}([0-9])
.D
: включить скрытые файлыe@...@
: квалификатор eval glob для запуска текста для дальнейшего уточнения файлов. Путь к файлу передан в$REPLY
zstat...
получить в массиве mtime в формате ГГГГММДД$m
.${REPLY:t}
: Расширяется до т хвоста (базового) файла.${(SM)something#pattern}
, Извлеките образец соответствия детали из чего-либо . ТеS
( S поиск ubstring) иM
(расширить до М atched части) называется флаги расширения параметров .источник