Эта полу-одиночная строка напечатает «ночные» файлы:
( \ llimit=$((60*5+0)); \ ulimit=$((60*22+45)); \ find -type f -exec bash -c '\ hm=`stat -c "%y" "$0" | cut -c 12-16`; \ t=$((60*10#`echo $hm | cut -c 1-2`+10#`echo $hm | cut -c 4-5`)); \ test \( $t -lt $1 \) -o \( $t -gt $2 \)' \ {} $llimit $ulimit \; \ -print \ )
Подстроки объяснили:
- Запускает подоболочку, чтобы сделать переменные локальными.
- Вычисляет нижний предел в минутах после полуночи.
- Рассчитывает верхний предел.
- Для каждого файла выполняется отдельный файл
bash
; это сделает арифметику. - Извлекает mtime как
HH:MM
. - Преобразуется
HH:MM
в значение в минутах после полуночи. - Сравнивает это значение с предварительно рассчитанными пределами.
- Это аргументы для внутреннего
bash
; внутри, они называются$0
,$1
,$2
. - Печатает путь, если предыдущий тест возвращает true.
- Заканчивает подоболочку.
Некоторые замечания:
-exec
может выступать в качестве теста приfind
вызове. Это вряд ли очевидно, но очень сильно. В этом случае проверка верна, когда последняя часть внутреннейbash
командной строки (т. Е.test
) Возвращает истину (т. Е. Ее состояние выхода равно0
).- Bash arithmetic (
$((…))
) разбирает01
или около того восьмеричное число,08
и09
является недопустимым восьмеричным числом. Вот почему нам нужно использовать,10#
чтобы все числа, извлеченные изstat
вывода, интерпретировались как десятичные. - Я использовал
-lt
и-gt
вtest
. Используйте-le
и / или-ge
если они вам больше подходят. - Для удаления файлов замените
-print
на-delete
(или используйте их вместе:)-print -delete
. Чтобы переместить файлы в один каталог заменить
-print
с-print0
и построить трубу, как это:( … find … -print0 ) | xargs -0r mv -t /target/directory/