Как я могу заставить `find` находить файлы в обратном хронологическом порядке?

17

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

Я просмотрел справочную страницу, но, похоже, она позволяет фильтровать только по меткам времени, а не сортировать по меткам времени.

Какие варианты я могу передать findдля достижения этой цели? Кроме того, как я могу объединить его с другим инструментом, например, sortсортировать по отметке времени?

merlin2011
источник
1
Вы не можете сделать findчто-либо в определенном порядке, кроме выбора между поиском по глубине и поиском по ширине.
Джонатан Леффлер
@ merlin2011, пожалуйста, просмотрите ваш выбор ответов здесь - выбранный в настоящее время ответ содержит ошибки (генерирует выходные данные, которые на самом деле не отсортированы правильно), когда найдено больше файлов, findчем может быть передано одному экземпляру ls.
Чарльз Даффи
@CharlesDuffy, спасибо за примечание! Я обновил принятые ответы.
merlin2011

Ответы:

32

Хотя решение Пола в целом нормально, оно требует больше операций ввода-вывода, чем просто:

find bin/ -type f -printf '%Ts\t%p\n' | sort -nr | cut -f2
Питер Мортенсен
источник
Что делать, если findвозвращает миллионы файлов? Разве сортировка не собирается сортировать их как один очень длинный список? Это все еще будет эффективно? (Вместо сортировки каждого каталога по отдельности.)
Питер Мортенсен
1
Не работает с забавными персонажами в именах файлов, такими как переводы строк
Борис Бродский
2
Это заслуживает только комментария к ответу user7385, но у меня нет репутации, чтобы сделать это. find bin/ -type f -printf '%Ts\t%p\0' | sort -nrz | cut -f2 -z | xargs -0 lsНовые версии cutимеют опцию -z, поэтому имена файлов с символами новой строки будут работать.
MattBlissett
Количество операций ввода-вывода даже не является основной причиной, по которой этот ответ предпочтительнее - правильность - гораздо более важное различие. xargs -0 ls -tПодход не будет работать правильно , когда есть так много файлов , которые xargsнеобходимо начать lsболее чем один раз, но этот подход будет продолжать функционировать.
Чарльз Даффи
@PeterMortensen, «сортировка их всех как одного очень длинного списка» - единственный способ сортировки, который на самом деле возвращает правильный результат. Более того, другой / принятый ответ также не «сортирует каждый каталог независимо» (если кто-то хочет отсортировать только один каталог без рекурсии, его можно использовать -maxdepth 1в find).
Чарльз Даффи