Як відобразити змінений час дати за допомогою команди 'find'?


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 

Чи є спосіб поєднати дві команди, щоб каталоги були в списку із зміненим часом дати?

Відповіді:


63

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

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

Це має дати ім'я файлу з подальшим часом модифікації в тому самому рядку виводу.


це краще, ніж моя відповідь, +1
Кент,

-printfВаріант нижче Уникає заходять statдля кожного знайденого файлу. У моєму тесті команда дає майже однаковий результат, лише точність додаткової цифри в секундах.
mwfearnley

Для MacOS символ аргументу формату для statє -f. find /var -maxdepth 2 -type d -exec stat -f "%t%Sm %N" {} \;
toddcscar

125

Прийнята відповідь працює, але вона повільна. Не потрібно виконувати статистику для кожного каталогу, find надає дату модифікації, і ви можете просто роздрукувати її безпосередньо. Ось еквівалентна команда, яка значно швидша:

 find /var -maxdepth 2 -type d -printf "%p %TY-%Tm-%Td %TH:%TM:%TS %Tz\n"

4
Набагато краще рішення. Він також працює з findопераційною системою msys, яка працює в ОС 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 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якого простіше простого.
Гжегож Краузе

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 

1
Це найпростіший, найлегший для запам’ятовування та найшвидший введення тексту. (Я використовую його без аргументів -mtime та -type, замість цього використовую -name '*.ext'специфікацію. ls -ltСортує за часом модифікації.)
Брент Фауст

1
Це не працює, коли ім'я файлу містить пробіли. Краще використовувати -print0замість, -printа потім використовувати xargs -0замість xargs.
emk2203

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
....
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.