Список всех файлов (с полными путями) в каталоге (и подкаталогах), упорядоченный по времени доступа

Я хотел бы создать команду Linux для перечисления всех файлов (с их полными путями) в определенном каталоге (и подкаталогах), упорядоченных по времени доступа.

ls может упорядочивать по времени доступа, но не дает полный путь. find дает полный путь, но единственный контроль над временем доступа, который у вас есть, - это указать диапазон с -atime N (доступ не менее 24 * N часов назад), а это не то, что я хочу.

Есть ли способ упорядочить по времени доступа и сразу получить полный путь? Я мог бы просто написать сценарий, но, кажется, должен быть способ сделать это с помощью стандартных программ Linux.


person Andrew    schedule 08.03.2012    source источник


Ответы (4)


find . -type f -exec ls -l {} \; 2> /dev/null | sort -t' ' -k +6,6 -k +7,7

Это найдет все файлы и отсортирует их по дате, а затем по времени. Затем вы можете использовать awk или cut для извлечения дат и имен файлов из вывода ls -l.

person Alex    schedule 08.03.2012
comment
Работает довольно хорошо. Я так понимаю, это не ограничивается getconf ARG_MAX? - person Andrew; 10.03.2012
comment
Правильно, это не ограничено ARG_MAX, потому что он не передает его в качестве аргументов, а вместо этого передает вывод. Нет предела тому, сколько данных может передаваться между программами. - person Alex; 11.03.2012
comment
Большой! Спасибо друг! Очень приятно знать об этом ограничении, так как в моем каталоге много-много файлов. - person Andrew; 12.03.2012
comment
Я сделал это немного иначе, чтобы всегда использовать лучший формат времени «ГГГГ-ММ-ДД ЧЧ:ММ:СС»: find . -type f -exec ls -l --time-style=+"%Y-%m-%d %H:%M:%S" {} \; 2> /dev/null | sort -t' ' -k +6,6 -k +7,7 - person loco.loop; 20.02.2018

вы можете попробовать:

 ls -l $(find /foo/bar -type f )
  • вы можете добавить другие параметры (например, -t для сортировки) в команду ls для достижения своей цели.
  • также вы можете добавить критерии поиска в find cmd
person Kent    schedule 08.03.2012
comment
Я немного изменил это и получил именно то, что хотел, с помощью ls -ult $(find DIRECTORY -type f ) | grep -o [^ ]\+$ Спасибо! - person Andrew; 08.03.2012
comment
Имейте в виду, что, поскольку вывод $(find DIRECTORY -type f ) используется в качестве аргумента командной строки для ls -ult, вы будете ограничены getconf ARG_MAX файлами. - person Alex; 08.03.2012
comment
Спасибо за наводку, Алекс! - person Andrew; 09.03.2012
comment
Чтобы сделать это в текущем каталоге, просто поставьте `pwd` (включая эти обратные кавычки, это с ключом тильды ~) вместо /foo/bar. И чтобы избежать проблем, когда в именах файлов есть пробелы, используйте это: find `pwd` -type f -print0 | xargs -0 ls -l (вы можете добавить дополнительные параметры к ls и, наконец, применить | grep, если хотите отфильтровать результаты). - person ADTC; 22.01.2016

find . -type f | xargs ls -ldt должен сработать, если файлов не так много, что вы нажмете команду, например ограничение аргумента, и создадите 2 экземпляра ls.

person Daenyth    schedule 08.03.2012

find . -type f -exec ls -l --full-time {} \; 2> /dev/null | sort -t' ' -k +6,6 -k +7,7

Ответ Алекса не сработал для меня, так как у меня были файлы старше одного года, и сортировка испортилась. В приведенном выше примере добавлен параметр --full-time, который нейтрализует значения даты/времени и делает их сортируемыми независимо от того, сколько им лет.

person Ron    schedule 04.06.2013
comment
Параметр --full-time не существует в Mac OS X. Решение @Kent работает очень хорошо. - person Anton Babenko; 04.09.2013