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

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-

работает, но не рекурсивно.

qazwsx
источник
Я предполагаю, что вы работаете в Linux, но вы должны явно указать свою ОС в вопросе или, желательно, в виде тега.
EBGreen

Ответы:

2

Вот метод, предложенный statкак @ johnshen64

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Computist
источник
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

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

johnshen64
источник
я также предполагаю, что это 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