Итак, вот сделка. Скажем, у меня есть каталог с именем "web", поэтому
$ ls -la
drwx------ 4 rimmer rimmer 4096 2010-11-18 06:02 web
НО внутри этого каталога, web/php/
$ ls -la
-rw-r--r-- 1 rimmer rimmer 1957 2011-01-05 08:44 index.php
Это означает, что хотя содержимое моего каталога, /web/php/index.php было в последний раз изменено в 2011-01-05, сам каталог/web/сообщается как последний измененный в 2010-11-18.
Что мне нужно сделать, это указать дату последней модификации my/web/каталога, указанную как последнюю дату изменения любого файла/каталога внутри этого каталога, рекурсивно.
Как мне это сделать?
Что-то вроде:
find /path/ -type f -exec stat \{} --printf="%y\n" \; |
sort -n -r |
head -n 1
Пояснение:
head -n 1
или sed 1q
вместо устаревшего синтаксиса.
Если у вас есть версия find
(например, GNU find
), которая поддерживает -printf
, то нет необходимости вызывать stat
несколько раз:
find /some/dir -printf "%T+\n" | sort -nr | head -n 1
или
find /some/dir -printf "%TY-%Tm-%Td %TT\n" | sort -nr | head -n 1
Если вам не нужна рекурсия:
stat --printf="%y\n" *
Если бы я мог, я бы проголосовал за ответ Пауло. Я проверил это и понял концепцию. Я могу подтвердить, что он работает.
Команда find
может выводить множество параметров.
Например, добавьте следующее в предложение --printf
:
%a for attributes in the octal format
%n for the file name including a complete path
Пример:
find Desktop/ -exec stat \{} --printf="%y %n\n" \; | sort -n -r | head -1
2011-02-14 22:57:39.000000000 +0100 Desktop/new file
Позвольте мне также поднять этот вопрос: Может ли автор этого вопроса решить свою проблему с помощью Bash или PHP? Это должно быть указано.
stat
и встроенный флаг -printf
для find
, а затем просто отбрасываете один из результатов. Я полагаю, что вам следует предпочесть последний, а не первый, как указано в отдельном ответе (нет необходимости создавать отдельный процесс для каждого файла, когда find
уже делает все это в одном процессе).