2014-02-09 2 views
2

Как найти 500 самых старых файлов?Найти 500 самых старых файлов

Что я пробовал:

find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500 
+2

, который будет печатать только 500 файлов, сортировать их по алфавиту и отображать первые 500. читать страницу поиска, выяснить, как распечатать временные метки файла FIRST, чтобы вы получили «<имя файла> в вашем выводе, а затем сообщите 'sort' для обработки целочисленного значения в первом столбце. –

+0

Что значит «старейший»? У вас есть файловая система, которая отслеживает время создания файла? Большинство файловых систем не сохраняют эту информацию. –

ответ

0

Следующая находит старые 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, чтобы устранить это безобидное сообщение.

Вышеупомянутое решение предполагает, что все имена файлов могут помещаться в одну командную строку в вашей оболочке.

+0

Метод ls не работает вообще. 'ls: невозможно получить доступ к ** **/mp4 ': нет такого файла или каталога' метод find не сортирует сначала «самые старые файлы». – Orlo

+0

'globstar' является опцией shopt. в ksh93 вы можете установить его с помощью 'set -o globstar' или' set -G', но они не работают в bash. – ormaaj

+0

@Orlo (a) Оба метода создают самые старые 500 файлов. Если вы хотите, чтобы старейший 500 с самым старым в верхней части, я могу добавить это. Обратите внимание, что метод 'find' выводит свой вывод на' ls', который сортирует по времени. (б) Сообщение «не может получить доступ», о котором вы сообщали, просто означает, что такого файла в подкаталоге не было. Если все ваши файлы не разбросаны по подкаталогам, вы можете опустить «**» globs. – John1024

1

Найти 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 несовместимы.

+0

Вы должны объяснить, что вы делаете. Вы используете замену процесса Bash, а также расширение '-printf' для поиска и завершение нулями строк, которые интерпретируется GNU' sort'. Все очень мощные, но нуждаются в некотором объяснении, поскольку все они являются расширениями GNU по сравнению с, скажем, стандартом POSIX. (Вы получаете кредит за высказывание GNU 'find' и' sort' спереди.) –

+0

@JonathanLeffler Спасибо. Добавлено несколько параграфов объяснения. – ormaaj

+0

не будет ли это проще? 'найти. -regex ". * \. \ (flv \ | mp4 \)" -тип f -printf '% T +% p \ n' | сортировать | head -n 500' – Orlo

Смежные вопросы