Как найти 500 самых старых файлов?Найти 500 самых старых файлов
Что я пробовал:
find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500
Как найти 500 самых старых файлов?Найти 500 самых старых файлов
Что я пробовал:
find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500
Следующая находит старые 500 файлов с самого старого файла в верхней части списка:
find . -regex '.*.\(mp4\|flv\)' -type f -print0 | xargs -0 ls -drt --quoting-style=shell-always 2>/dev/null | head -n500
Выше трубопровод. Первый шаг - найти имена файлов, которые выполняются путем поиска. Любые параметры поиска можно использовать для выбора интересующих вас файлов. На втором этапе сортировка. Это выполняется с xargs
, передавая имена файлов ls
сортами во времени в обратном порядке, чтобы самые старые файлы находились в верхней части. Последний шаг: head -n500
, который принимает только первые 500 имен файлов. Первое из этих имен будет самым старым файлом.
Если файлов более 500, то head
завершается до ls
. Если это произойдет, ls
выдает сообщение: terminated by signal 13
. Я перенаправил stderr из команды xargs, чтобы устранить это безобидное сообщение.
Вышеупомянутое решение предполагает, что все имена файлов могут помещаться в одну командную строку в вашей оболочке.
Метод ls не работает вообще. 'ls: невозможно получить доступ к ** **/mp4 ': нет такого файла или каталога' метод find не сортирует сначала «самые старые файлы». – Orlo
'globstar' является опцией shopt. в ksh93 вы можете установить его с помощью 'set -o globstar' или' set -G', но они не работают в bash. – ormaaj
@Orlo (a) Оба метода создают самые старые 500 файлов. Если вы хотите, чтобы старейший 500 с самым старым в верхней части, я могу добавить это. Обратите внимание, что метод 'find' выводит свой вывод на' ls', который сортирует по времени. (б) Сообщение «не может получить доступ», о котором вы сообщали, просто означает, что такого файла в подкаталоге не было. Если все ваши файлы не разбросаны по подкаталогам, вы можете опустить «**» globs. – John1024
Найти 500 старых файлов с помощью GNU найти и GNU рода:
#!/bin/bash
typeset -a files
export LC_{TIME,NUMERIC}=C
n=0
while ((n++ < 500)) && IFS=' ' read -rd '' _ x; do
files+=("$x")
done < <(find /storage -type f \(-name '*.mp4' -o -name '*.flv' \) -printf '%[email protected] %p\0' | sort -zn)
printf '%q\n' "${files[@]}"
Update - некоторые объяснения:
Как уже упоминалось Джонатаном в комментариях, правильный способ справиться с этим связано много не -стандартные функции, которые позволяют создавать и потреблять списки с нулевым разделителем, чтобы произвольные имена файлов можно было безопасно обрабатывать.
GNU ФАЙНДА -printf
производит (время изменения, используя формат недокументированного %[email protected]
. Мое предположение было бы, что работает ли это или нет, зависит от вашей библиотеки C), затем пробел, а затем имя файла с прекращением \0
. Два дополнительных нестандартных функции обрабатывают вывод: опция GNU sort -z
и опция read
builtin's -d
, которая с пустым аргументом параметра ограничивает ввод значений с нулями. Общий эффект состоит в том, чтобы упорядочить элементы по методу mtime, произведенному командой 10, а затем прочитать первые 500 результатов в массиве, используя IFS
, чтобы разбить входной сигнал read
и отбросить первый элемент в переменную _
, оставив только имя файла.
Наконец, мы печатаем массив, используя формат %q
, чтобы отображать результаты однозначно с гарантией одного файла на строку.
Синтез процесса (<(...)
) не является полностью необходимым, но позволяет избежать подоболочки, вызванной трубой, в версиях, для которых отсутствует опция lastpipe
. Это может быть преимуществом, если вы решите сделать скрипт более сложным, чем просто распечатать результаты.
Ни одна из этих функций не уникальна для GNU. Все это может быть выполнено с использованием, например, AST find(1), openbsd sort(1)
и либо Bash, mksh, zsh, либо ksh93 (v
или выше). К сожалению, строки формата find
несовместимы.
Вы должны объяснить, что вы делаете. Вы используете замену процесса Bash, а также расширение '-printf' для поиска и завершение нулями строк, которые интерпретируется GNU' sort'. Все очень мощные, но нуждаются в некотором объяснении, поскольку все они являются расширениями GNU по сравнению с, скажем, стандартом POSIX. (Вы получаете кредит за высказывание GNU 'find' и' sort' спереди.) –
@JonathanLeffler Спасибо. Добавлено несколько параграфов объяснения. – ormaaj
не будет ли это проще? 'найти. -regex ". * \. \ (flv \ | mp4 \)" -тип f -printf '% T +% p \ n' | сортировать | head -n 500' – Orlo
, который будет печатать только 500 файлов, сортировать их по алфавиту и отображать первые 500. читать страницу поиска, выяснить, как распечатать временные метки файла FIRST, чтобы вы получили «<имя файла> в вашем выводе, а затем сообщите 'sort' для обработки целочисленного значения в первом столбце. –
Что значит «старейший»? У вас есть файловая система, которая отслеживает время создания файла? Большинство файловых систем не сохраняют эту информацию. –