Удалить небольшие папки до 50 МБ с пробелами в имени

Как удалить все папки в каталоге размером менее 50 МБ? В каталогах есть пробелы и специальные символы в именах, но нет перевода строки. Внутри каталогов могут быть подкаталоги, так что мне просто нужен размер каталогов первого уровня и поиск всего менее 50 МБ.

Directory Example:
/test
--/test/Example
--/test/Example 2
--/test/Sample Directory Inside (2018)
--/test/Sample & Test Directory
--/test/Sample/Inside Directory

Он должен найти все каталоги в каталоге /test размером менее 50 МБ и удалить этот каталог. Спасибо заранее за помощь.

2 ответа

Решение

Однострочное использование find:

find /test -mindepth 1 -type d -prune \
  -exec sh -c '[ $(du -s "$1" | awk "{print \$1}") -lt 50000 ] && echo rm -Rf "$1"' _ {} \;

Удалить echo перед rm если это работает для вас.

Объяснение:

  • find /test -mindepth 1 -type d -prune найти все каталоги в /test (и не переходить в каталоги, которые удаляются).
  • -exec sh -c 'cmd "$1"' _ {} \; бежать cmd с путем к папке ({}в качестве аргумента $1,
  • [ $(du -s "$1" | awk "{print \$1}") -lt 50000 ] && rm -Rf "$1" Проверьте размер каталога и удалите его, если он меньше 50 000 байт (50 МБ).

Вот простой скрипт Bash, который использует команду du чтобы получить размер каталога:

#!/bin/bash

TARGET_DIR="/test"

# For each sub dir in $TARGET_DIR
for dir in "$TARGET_DIR"/*/
do
    # If the result of the command substitution $(...) is lower or equal to 50000
    if [[ $(du -s "$dir" | awk '{print $1}') -le 50000 ]]
    then
        # Do (remove `echo' to apply the action):
        echo rm -rf "$dir"
    fi
done
  • Что делает подстановка команды:

    • du -s - отображать только сумму для каждого аргумента.
    • | - передать вывод предыдущего в стандартный ввод следующей команды
    • awk '{print $1}' - выведет только первое поле
  • В качестве альтернативы вы можете использовать арифметическое выражение:

    if (( "$(du -s "$dir" | awk '{print $1}')" <= 50000 )); then rm -rf "$dir"; fi
    
  • Вы также можете играть с du варианты: например добавить -m ( источник) и измените условие:

    if (( "$(du -sm "$dir" | awk '{print $1}')" <= 50 )); then rm -rf "$dir"; fi
    
  • Предыдущая версия ответа: https://Ask-ubuntu.ru/revisions/1073858/2

Другие вопросы по тегам