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

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

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

Это должно найти все каталоги в тестовом месте / менее чем 50 МБ в размере и удалить тот каталог. Заранее спасибо за Вашу помощь.

1
задан 8 September 2018 в 19:42

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 найдите все каталоги в тесте / (и не делайте достойный в каталоги, которые удалены).
  • -exec sh -c 'cmd "$1"' _ {} \; выполненный cmd с путем к папке ({}) как аргумент $1.
  • [ $(du -s "$1" | awk "{print \$1}") -lt 50000 ] && rm -Rf "$1" Проверьте размер каталога и удалите, если меньший, чем 50 000 байтов (50M).
1
ответ дан 3 December 2019 в 07:23

Вот простой сценарий 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 - отобразите только общее количество для каждого аргумента.
    • | - передайте вывод по каналу до stdin следующей команды
    • 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://askubuntu.com/revisions/1073858/2

2
ответ дан 3 December 2019 в 07:23

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

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