Как отобразить измененную дату и время с помощью команды «найти»?

85

С помощью findкоманды я могу отображать имена каталогов на нескольких уровнях. Следующая команда отображает все каталоги по /varпути с глубиной 2:

find /var -maxdepth 2 -type d;

Результат показывает:

/var
/var/log
/var/log/sssd
/var/log/samba
/var/log/audit
/var/log/ConsoleKit
/var/log/gdm
/var/log/sa

С помощью statкоманды я могу найти измененную дату и время:

stat /var/log/samba | grep 'Modify:'

Результат:

Modify: 2014-01-02 11:21:27.762346214 -0800 

Есть ли способ объединить две команды, чтобы каталоги отображались с измененной датой и временем?

Purres
источник

Ответы:

63

Вы можете использовать -execпереключатель findи определить выходной формат statиспользования -cпереключателя следующим образом:

find /var -maxdepth 2 -type d -exec stat -c "%n %y" {} \;

Это должно дать имя файла с указанием времени его модификации в той же строке вывода.

rc0r
источник
это лучше, чем мой ответ, +1
Кент
-printfВариант ниже Избегает заходящих statдля каждого найденного файла. В моем тесте команда дает почти идентичный результат, только с дополнительной точностью до секунд.
mwfearnley
Для MacOS символ аргумента формата stat- -f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar
126

Принятый ответ работает, но медленно. Нет необходимости запускать статистику для каждого каталога, find предоставляет дату изменения, и вы можете просто распечатать ее напрямую. Вот эквивалентная команда, которая значительно быстрее:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"
кзарь
источник
4
Намного лучшее решение. Он также работает с findmsys, работающим в Windows, в котором отсутствует statкоманда.
Snorfalorpagus
7
На компьютерах Mac введите «brew install findutils», а затем в gfind есть параметр -printf.
WeakPointer
%Tcпечатает «дату и время локали», разрешая строку формата «% p% Tc»
Андреас
Более полезные ссылки для объяснения средств форматирования%. unix.stackexchange.com/a/215236/216480 или на странице руководства найдите "-printf format"
styks
1
Хотя строка формата "% p% Tc" работает, она форматирует вывод немного иначе. Например, "/ var / spool Mon 29 Sep 2014 09:05:54 BST" вместо "/ var / spool 2014-09-29 09: 05: 54.000000000 +0100".
kzar
15

find /var -maxdepth 2 -type d | xargs ls -oAHd

Это способ заставить вашу базовую lsкоманду отображать полный путь к каталогу. Хотя lsесть -Rпараметр для рекурсивного поиска, дорожки не будут отображаться в результатах поиска с -lили -oвариантом (в OSX, по крайней мере), напр с: ls -lR.

отметка
источник
Пожалуйста, объясните, почему это отвечает на вопрос. Как правило, каждый раз, когда вы публикуете пример кода в ответе на StackOverflow, культура всегда должна давать ему объяснение. В противном случае модераторы могут удалить ваш ответ как некачественный из-за его короткой длины и отсутствия пояснений.
sideshowbarker
3
То, что вы можете сделать, find /var -maxdepth 2 -type d -lsпроще простого.
Grzegorz Krauze
13

Последние версии GNU findтакже включают -printfопцию, которая включает поля даты. Если вам нужно напечатать имя файла и время модификации в стандартном формате «C», вы можете использовать -printf "%c %p\n".

Если вам нужна дата в определенном формате, вы можете использовать %Cсимвол, за которым следует поле. Например, год будет 4-значным %CY, с Yсимволом для 4-значного года.
Обратите внимание: если вам нужно несколько полей, вам нужно будет указать их %Cнесколько раз. Например, формат ГГГГ-ММ-ДД будет выглядеть так %CY-%Cm-%Cd.

Дополнительные сведения см. На страницах руководства или в интерактивной документации .

Вот рабочий пример:

find . -name favicon.ico -printf "%c %p\n"
Г-н лама
источник
8

Еще один, который я использую для печати измененных файлов за последний день. ls -ltr дает мне более подробную информацию, например, время модификации, пользователя и т. д.

find <my_dir> -mtime -1 -type f -print | xargs ls -ltr 
user666
источник
1
Это самый простой, легкий для запоминания и самый быстрый набор. (Я использую его без аргументов -mtime и -type, вместо этого использую -name '*.ext'спецификацию. ls -ltSorts по времени модификации.)
Брент Фауст,
2
Это не работает, если имя файла содержит пробелы. Лучше использовать -print0вместо, -printа затем использовать xargs -0вместо xargs.
emk2203 03
xargsможет вызывать команду ( lsздесь) несколько раз, в зависимости от количества параметров, чтобы предотвратить вызов команды с чрезмерным количеством параметров. Следовательно, сортировка (независимо от критерия, в том числе по дате) может дать «неправильный» результат (=> список отсортированных подмножеств вместо отсортированного полного набора).
syme
1

попробуйте эту строку:

find /var -maxdepth 2 -type d|xargs stat|grep -E 'File|Modi'

вот я его запустил, он выводит:

....
  File: ‘/var/cache/cups’
Modify: 2013-12-24 00:42:59.808906421 +0100
  File: ‘/var/log’
Modify: 2014-01-01 12:41:50.622172106 +0100
  File: ‘/var/log/old’
Modify: 2013-05-31 20:40:23.000000000 +0200
  File: ‘/var/log/journal’
Modify: 2013-12-15 18:56:58.319351603 +0100
  File: ‘/var/log/speech-dispatcher’
Modify: 2013-10-27 01:00:08.000000000 +0200
  File: ‘/var/log/cups’
Modify: 2013-12-22 00:49:52.888346088 +0100
  File: ‘/var/opt’
Modify: 2013-05-31 20:40:23.000000000 +0200
....
Кент
источник