Команда для удаления каталогов, содержимое которых меньше заданного размера

Я работаю в каталоге ~/foo который имеет подкаталоги

 ~/foo/alpha ~/foo/beta ~/foo/epsilon ~/foo/gamma 

Я хотел бы выпустить команду, которая проверяет общий размер под каждым поддиректорией уровня 1 ~/foo и удаляет каталог вместе с его содержимым, если размер находится под заданной суммой.

  • Рабочий процесс на основе файлов и каталогов
  • Почему `find -name * .jks` не возвращает некоторые файлы?
  • копировать рекурсивно пропускающие каталоги с определенным именем
  • Как использовать результаты «файла» (Имя приложения: Microsoft Word) для поиска определенной строки?
  • Как удалить каталоги на основе вывода `find`?
  • mv: невозможно удалить каталог: каталог не пуст
  • Итак, скажем, я хотел бы удалить каталоги, содержимое которых меньше 50K . Выдача $ du -sh */ возвращает

     8.0K alpha/ 114M beta/ 20K epsilon/ 1.2G gamma/ 

    Я бы хотел, чтобы моя команда удаляла ~/alpha и ~/epsilon вместе с их содержимым. Есть ли такая команда? Я подозреваю, что это можно сделать с find но я не совсем уверен, как это сделать.

  • Что такое несмежный каталог?
  • Как передать файлы, найденные в качестве аргументов?
  • rm -fr не работает
  • У кучи файлов есть 777 разрешений
  • Массовое удаление большого каталога на ZFS без его рекурсивного перемещения
  • Можно ли создать многоуровневый каталог?
  • 2 Solutions collect form web for “Команда для удаления каталогов, содержимое которых меньше заданного размера”

    С GNU find и GNU coreutils , и если ваши каталоги не имеют новых строк в их именах:

     find ~/foo -mindepth 1 -maxdepth 1 -type d -exec du -ks {} + | awk '$1 <= 50' | cut -f 2- 

    Это приведет к отображению каталогов с общим содержимым, меньшим 50K. Если вы довольны результатами и хотите их удалить, добавьте | xargs -d \\n rm -rf | xargs -d \\n rm -rf до конца командной строки.

    Первый ответ работает хорошо, но не с именем dir, которое содержит пробелы. (исправленная логика, потому что это было что-то 50Kb или более)

     #RESULTTODELETE=$(find ~/foo -mindepth 1 -maxdepth 1 -type d -exec du -ks {} + | awk '$1 <= 50' | cut -f 2-); RESULTTODELETE2=$(echo "$RESULTTODELETE" | sed 's, ,\\ ,g'); echo "$RESULTTODELETE2" | xargs rm -rf 

    Будет работать с:

     ~/f oo/a lpha ~/fo o/be ta ~/foo/ep silon ~/foo/gamma 
    Linux и Unix - лучшая ОС в мире.