Удалить небольшие папки до 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