в терминале Linux, как мне показать дату последней модификации папки, учитывая ее содержимое?

54

Итак, вот сделка. Скажем, у меня есть каталог с именем "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/каталога, указанную как последнюю дату изменения любого файла/каталога внутри этого каталога, рекурсивно.

Как мне это сделать?

  • 1
    Мне любопытно, почему вы думаете, что вам нужно сделать это.
Теги:
scripting

3 ответа

47
Лучший ответ

Что-то вроде:

find /path/ -type f -exec stat \{} --printf="%y\n" \; | 
     sort -n -r | 
     head -n 1

Пояснение:

  • команда find будет печатать время модификации для каждого файла, рекурсивно игнорируя каталоги (согласно комментарию IQAndreas вы не можете полагаться на временные метки папок)
  • sort -n (числовое) -r (обратное)
  • head -n 1: получить первую запись
  • 2
    должен любить пайпинг ...
  • 1
    Согласно документации на coreutils , вы можете рассмотреть head -n 1 или sed 1q вместо устаревшего синтаксиса.
Показать ещё 3 комментария
17

Если у вас есть версия 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" *
5

Если бы я мог, я бы проголосовал за ответ Пауло. Я проверил это и понял концепцию. Я могу подтвердить, что он работает. Команда 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? Это должно быть указано.

  • 2
    Хороший вопрос, я думал, что это было очевидно, хотя, как говорят мои теги, "bash, scripting, shell". Я хочу решить эту проблему, используя Bash, да. Это для резервного копирования файлов сервера. Я думаю, что проблема решена сейчас, решения работают идеально :)
  • 0
    Похоже, вы используете и stat и встроенный флаг -printf для find , а затем просто отбрасываете один из результатов. Я полагаю, что вам следует предпочесть последний, а не первый, как указано в отдельном ответе (нет необходимости создавать отдельный процесс для каждого файла, когда find уже делает все это в одном процессе).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню