Как удалить все файлы во всех подкаталогах, сохранив самый большой файл в каждом подкаталоге в Linux?

Как удалить все файлы во всех подкаталогах, сохранив самый большой файл в каждом подкаталоге в Linux?

Это мой первый вопрос, спасибо, что позволили мне задать его и прочитали мой вопрос!

Я работаю под Ubuntu 22.04 с GNOME Shell и bash shell. У меня есть папка с более чем 800 подкаталогами. Каждый подкаталог содержит от 4 до 8 версий одного и того же видео в разных разрешениях. Для каждого видео/подкаталога я хочу сохранить только лучшее разрешение.

Как рекурсивно удалить все файлы во всех подкаталогах, оставив только самый большой файл в каждом подкаталоге?

решение1

Извините, я не собираюсь писать для вас скрипт, но вот один из возможных алгоритмов, который можно использовать. (Хотя нижеприведенный пример использует элементы скрипта, он далек от точного скрипта, и простая попытка вставить команды может иметь катастрофические последствия)

Прежде чем делать что-либо из этого, я настоятельно рекомендую скопировать всю структуру каталогов на другой диск, где вы сможете протестировать скрипт перед его выполнением и случайно удалить файлы, которые вы не сможете восстановить.

  1. Из верхнего каталога fldrLst='find ./ -type d'(я использую одинарные кавычки для левых делений)
  2. Из верхнего каталога выполните цикл $fldrLst, выполняя следующие действия:
    • Получить список файлов из одного листа каталога в порядке убывания размера файла: fileLst='find $fldrList[n] -type f -maxdepth 1 -exec ls -al {} \; | sort k 5 -nr'где [n]— конкретный член массива списка.
    • Количество файлов в каталоге:echo $fildLst | wc -l
    • Удалите каждый файл после первой записи (которая должна быть самым большим файлом): выполните цикл $fileLstи удалите rm $fileList[n](где первая запись n— это вторая запись в массиве).

Это должно направить вас на верный путь к выполнению вашей задачи.


Если этот ответ оказался полезен и помог вам найти решение, обязательно отметьте его как ответ или проголосуйте за него как за частичное решение.

решение2

linux - Удалить все файлы, кроме самого большого - Super User

Тестовая версия, она будет удалять только те файлы ls, которые будут:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r ls -l

Рабочая версия, она удалит ваши файлы:

find -type d -exec sh -c 'find "$0" -maxdepth 1 -mindepth 1 -type f -exec stat --printf "%s %n\0" \{\} + | sort -znr | tail -zn +2' {} \; | cut -zf 2- -d " " | xargs -0r rm

Исходный кодКамиль Мациоровски

Связанный контент