Я ищу оболочку с одной строкой, чтобы найти самый старый файл в дереве каталогов.
72
Это работает (обновлено, чтобы включить предложение Даниэля Андерссона):
find -type f -printf '%T+ %p\n' | sort | head -n 1
find -type f -printf '%T+ %p\n' | sort | head -1
find
пуста из-за того, что у меня есть имя файла содержит новую строку .Это немного более переносимо, и потому что оно не зависит от
find
расширения GNU-printf
, поэтому оно работает и на BSD / OS X:Единственным недостатком здесь является то, что он несколько ограничен размером
ARG_MAX
(который не должен иметь значения для большинства новых ядер). Так что, еслиgetconf ARG_MAX
возвращено больше символов (262 144 в моей системе), это не даст вам правильный результат. Это также не POSIX-совместимый, потому что-print0
иxargs -0
не.Здесь описаны некоторые другие решения этой проблемы: Как найти самый последний (самый новый, самый ранний, самый старый) файл в каталоге? - Грег вики
источник
xargs: ls: terminated by signal 13
ошибку как побочный эффект. Я предполагаю, что это SIGPIPE. Я понятия не имею, почему я не получаю подобную ошибку, когда я направляю вывод сортировки в заголовок в моем решении.head
команда, которая завершает работу после того, как прочитала строку и, таким образом, «разрывает» канал, я думаю. Вы не получаете ошибку, потомуsort
что, кажется, не жалуетесь на это, ноls
в другом случае.xargs
нужно вызыватьls
более одного раза. В этом случае отсортированные выходные данные этих нескольких вызовов в конечном итоге объединяются, когда они должны быть объединены.ls
его просмотреть и просмотреть самый старый файл, ваше решение, вероятно , превысит ограничение длины командной строки, вызываяls
его многократный вызов. Вы получите неправильный ответ, но никогда не узнаете.Следующие команды гарантированно работают с любыми странными именами файлов:
Использование нулевого byte (
\0
) вместо символа перевода строки (\n
) гарантирует, что вывод find будет по-прежнему понятен в случае, если одно из имен файлов содержит символ перевода строки.-z
Переключатель делает как - то и Grep интерпретировать только нулевые байты как отслужившую строки символов. Поскольку такого переключателя для головы нет, мы используем егоgrep -m 1
(только одно вхождение).Команды упорядочены по времени выполнения (измерено на моей машине).
Первая команда будет самой медленной, поскольку она должна сначала преобразовать mtime каждого файла в читабельный формат, а затем отсортировать эти строки. Трубка к кошке позволяет избежать окрашивания продукции.
Вторая команда немного быстрее. В то время как он все еще выполняет преобразование даты, численно сортировка (
sort -n
) истекла, поскольку эпоха Unix немного быстрее. sed удаляет секунды, начиная с эпохи Unix.Последняя команда не выполняет преобразования вообще и должна быть значительно быстрее, чем первые две. Сама команда find не будет отображать mtime самого старого файла, поэтому требуется статистика.
Связанные справочные страницы: find - grep - sed - sort - stat
источник
Хотя принятый ответ и другие здесь делают свою работу, если у вас очень большое дерево, все они будут сортировать всю кучу файлов.
Лучше было бы, если бы мы могли просто перечислить их и отслеживать самые старые, без необходимости сортировки вообще.
Вот почему я придумал это альтернативное решение:
Я надеюсь, что это может помочь, даже если вопрос немного устарел.
Редактировать 1: эти изменения позволяют анализировать файлы и каталоги с пробелами. Он достаточно быстр, чтобы выдать его в корень
/
и найти самый старый файл.Команда объяснила:
Запуск это:
РЕДАКТИРОВАТЬ 2: та же концепция, лучшее решение, использующее
find
для просмотра времени доступа (используйте вместо%T
первогоprintf
для времени модификации или%C
для изменения статуса ).РЕДАКТИРОВАТЬ 3: Команда ниже использует время модификации, а также печатает пошаговый прогресс при поиске старых и старых файлов, что полезно, если у вас есть неправильные метки времени (например, 1970-01-01):
источник
ls
плохо для сценариев, так как его вывод не предназначен для машин, форматирование вывода варьируется в зависимости от реализации. Как вы уже сказали,find
это хорошо для написания сценариев, но также может быть полезно добавить эту информацию, прежде чем рассказывать оls
решениях.Пожалуйста, используйте ls - страница руководства расскажет вам, как заказать каталог.
-N 2 означает, что вы не получите «итого» в выводе. Если вы хотите только имя файла.
И если вам нужен список в обычном порядке (получение новейшего файла)
Гораздо проще, чем использовать find, гораздо быстрее и надежнее - вам не нужно беспокоиться о форматах имен файлов. Это должно работать почти на всех системах.
источник
источник
sort -n
.Кажется, что под «самым старым» большинство людей полагало, что вы имели в виду «самое старое время модификации». Это, вероятно, исправлено в соответствии с самым строгим толкованием «самого старого», но в случае, если вам нужен тот, у которого самое старое время доступа , я бы изменил лучший ответ следующим образом:
Обратите внимание
%A+
.источник
find ./search/dirname -type f -printf '%T+ %h/%f\n'
печатает даты и имена файлов в двух столбцах.sort | head -n1
сохраняет строку, соответствующую самому старому файлу.echo $2
отображает второй столбец, т.е. имя файла.источник