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


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.