Як перераховувати файли рекурсивно і сортувати їх за часом модифікації?


13

Як перерахувати всі файли в каталозі рекурсивно і сортувати вихід за часом модифікації?

Я зазвичай використовую, ls -lhtcале він не знаходить всі файли рекурсивно. Я використовую Linux та Mac.

ls -l на Mac OS X може дати

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

де частина дати не узгоджена або вирівняна, тому рішення повинно враховувати це.

Часткове рішення

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

працює, але не рекурсивно.


Я припускаю, що ви працюєте в Linux, але ви повинні чітко вказати свою ОС або в питанні, або бажано в якості тегу.
EBGreen

Відповіді:


2

Ось метод, який використовується statяк @ johnshen64

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-

find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-буде надруковано лише абсолютні шляхи до файлів на ОС X.
липня

яку версію statви використовуєте? Ваш формат вище не працював для мене. Я повинен був використовувати наступне: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Це зstat (GNU coreutils) 8.23
користувачем84207

12

Використовуйте find«s -printfі сортування за розумною формат дати:

find -type f -printf '%T+\t%p\n' | sort -n

Це повинно мінімізувати вилки для процесів і, таким чином, бути найшвидшим.

Приклади, якщо вам не подобається дробова друга частина (яка часто все одно не реалізована у файловій системі):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: Стандарт findна Mac не має -printf. Але не важко встановити GNU find на Mac (також дивіться цю посилання для отримання додаткових застережень щодо сумісності Mac / Linux та xargs).


0

find .повинні мати можливість отримати всі файли. Щось на зразок цього:

find . -exec ls -dl '{}' \; | sort -k 6,7

Вам потрібно налаштувати його на свої потреби.


Я також припускаю, що це Linux, як сказав EBGreen, ls - псевдонім у Windows PS, тому вам потрібно використовувати сортування-об'єкт і отримувати дочірні елементи рекурсивно, якщо це так, але ідея така ж.
johnshen64

Це дійсно правильно, коли дати іноді пропускають частину року на Mac?
qazwsx

Ви маєте рацію, відображення дати для останніх файлів зіпсує речі. вам потрібно використовувати stat замість того, щоб отримати точно відформатовану дату в такому випадку. мої файли всі дуже старі, тому команда спрацювала нормально, тому я додав пункт про мелодію :-)
johnshen64

@ johnshen64: lsв Linux є --time-formatопція, яку ви можете використовувати для того, щоб і останні, і старі дати файлів відображалися в одному форматі.
RedGrittyBrick

ах спасибі, ти маєш рацію, просто не використовував цього. це набагато простіше, ніж використання stat. це називається - часовий стиль, я думаю.
johnshen64

0

Ця відповідь на подібне запитання на сайті Unix Stack Exchange допомогла мені, оскільки я використовував zsh:

Як перераховувати файли, відсортовані за датою модифікації рекурсивно (команда stat не доступна!)


Це справді коментар, а не відповідь на початкове запитання. Ви завжди можете коментувати свої власні публікації, і як тільки у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію . Будь ласка, прочитайте Чому мені потрібно коментувати 50 репутацій? Що я можу зробити замість цього?
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.