
Это мой первый вопрос, спасибо, что позволили мне задать его и прочитали мой вопрос!
Я работаю под Ubuntu 22.04 с GNOME Shell и bash shell. У меня есть папка с более чем 800 подкаталогами. Каждый подкаталог содержит от 4 до 8 версий одного и того же видео в разных разрешениях. Для каждого видео/подкаталога я хочу сохранить только лучшее разрешение.
Как рекурсивно удалить все файлы во всех подкаталогах, оставив только самый большой файл в каждом подкаталоге?
решение1
Извините, я не собираюсь писать для вас скрипт, но вот один из возможных алгоритмов, который можно использовать. (Хотя нижеприведенный пример использует элементы скрипта, он далек от точного скрипта, и простая попытка вставить команды может иметь катастрофические последствия)
Прежде чем делать что-либо из этого, я настоятельно рекомендую скопировать всю структуру каталогов на другой диск, где вы сможете протестировать скрипт перед его выполнением и случайно удалить файлы, которые вы не сможете восстановить.
- Из верхнего каталога
fldrLst='find ./ -type d'
(я использую одинарные кавычки для левых делений) - Из верхнего каталога выполните цикл
$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
Исходный кодКамиль Мациоровски