Как вывести список файлов рекурсивно и отсортировать их по времени модификации?


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-будет печатать только абсолютные пути файлов в OS X.
— Lri

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

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

РЕДАКТИРОВАТЬ: Стандарт findна Mac не имеет -printf. Но установить GNU find на Mac несложно (см. Также эту ссылку, чтобы узнать больше о совместимости Mac / Linux и xargs).


0

find .должен иметь возможность получить все файлы. Что-то вроде этого:

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

Вы должны настроить его для своих нужд.


я также предполагаю, что это linux, как сказал EBGreen, ls - это псевдоним в Windows PS, поэтому вам нужно использовать sort-object и рекурсивно получать дочерние элементы, если это так, но идея та же.
— johnshen64

Действительно ли это работает правильно, когда даты иногда пропускают часть года, на Mac?
— qazwsx

вы правы, отображение даты для последних файлов испортит вещи. вместо этого вам нужно использовать stat, чтобы получить точно отформатированную дату в этом случае. все мои файлы очень старые, поэтому команда работала нормально, поэтому я добавил предложение tune :-)
— 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.