Как найти и удалить файлы, более старые, чем определенные дни в Unix?

find -type f -name "*.mp4" -print0

Рекурсивно ищите текущий каталог нормальные файлы, имена которых заканчиваются .mp4 и распечатайте их относительные пути, разделенные пустыми байтами. -print0 более безопасно, чем -print здесь, потому что новые строки являются допустимыми символами в имени файла. найдите (1)

| xargs -0

Используйте вход в качестве аргументов следующей команде. Вход разделяется от пустого указателя. xargs (1)

mplayer -vo dummy -ao dummy -identify 2>/dev/null

Это - команда это xargs работает. Используя фиктивные видеодрайверы и драйверы аудио, покажите параметры файла в легко parseable формате. Отбросьте любой вывод от STDERR. mplayer (1)

| perl -nle

Передайте вывод по каналу к Perl. Perl считает строки входа в $_ переменная, разделяя новые строки от конца. perlrun (1)

/ID_LENGTH=([0-9\.]+)/

Если строка соответствует этому регулярному выражению, получите число после "ID_LENGTH =",

&& ($t +=$1)

затем увеличьте переменную $t числом, полученным в первом соответствии,

&& printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60'

и вычислите часы, минуты и секунды от $t, который является количеством секунд. Из-за -l в вызове жемчуга новая строка добавляется автоматически к print операторы, но нет printf, таким образом, строка формата содержит один (" \n").

| tail -n 1

Только распечатайте последнюю строку вывода. хвост (1)

Для превращения этого конвейера в единственную команду можно создать функцию оболочки в Вашем .bashrc или безотносительно емкостно-резистивного файла Ваше использование оболочки. Вот пример:

vid_lengths() {
  find -type f -name "*.mp4" -print0 \
    | xargs -0  mplayer -vo dummy -ao dummy -identify 2>/dev/null \
    | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' \
    | tail -n 1
}
39
24.07.2015, 07:27
5 ответов

Можно начать с find /var/dtpdev/tmp/ -type f -mtime +15. В результате вы найдете все файлы старше 15 дней и распечатаете их имена. Опционально в конце команды можно указать -печать, но это действие по умолчанию. Рекомендуется сначала выполнить вышеприведенную команду, чтобы посмотреть, какие файлы выбраны.

После проверки, что команда find перечисляет файлы. которые ты хочешь удалить (и никаких других), вы можете добавить "действие" для удаления файлов. Типичными действиями для этого являются:

  1. -exec rm -f {}. \; (или, эквивалентно, -exec rm -f {} ';")
    . При этом для каждого файла будет выполняться rm -f; например,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; ...
    
  2. -exec rm -f {} +
    Это запустит rm -f на многих файлах одновременно; например,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 ...
    

    поэтому он может быть немного быстрее, чем вариант 1.  (Может понадобиться несколько раз запустить rm -f, если у вас тысячи файлов.)

  3. -delete
    Это говорит о том, что найдет сам, чтобы удалить файлы, не запуская rm. Это может быть бесконечно быстрее, чем варианты -exec, но он не будет работать на всех системах.

Итак, если вы используете вариант 2, то вся команда будет:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +
57
27.01.2020, 19:35

Или сделайте это с помощью цикла:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done
-1
27.01.2020, 19:35

Попробуйте:

find /path/to/files/  -cmin +240  -type f -name *.php  -delete

ИЛИ

find /path/to/files/ -type f -name *.php  -mtime +30 -exec rm {} \;

Первый удалит файлы старше 4 часов, используя встроенную -функцию удаления find; а второй удалит файлы старше 30 дней, используя rmв предложении -exec.

-2
08.08.2020, 17:11

Другим вариантом может быть передача вывода команды findи использование xargsдля удаления этих:

find /var/dtpdev/tmp/ -type f -mtime +15 | xargs rm

Но ответ Яна, за который проголосовали, все же более действителен, чем этот.

2
28.05.2021, 10:04

Мне нравится

rm -rf `find yadi` 

за его простоту. Эти обратные галочки говорят: «Казните меня первым». Таким образом, вы работаете rm -rfс результатами того, что находится между ними.

0
16.11.2021, 20:08

Теги

Похожие вопросы