Как я удаляю все папки в каталоге, которые находятся под общим количеством на 50 МБ в размере? Каталоги имеют пробелы и специальные символы на их имена, но никакие переводы строки. В каталогах могли быть подкаталоги, таким образом, мне просто нужен размер первых каталогов уровня и поиска общего количества меньше чем на 50 МБ в размере.
Directory Example:
/test
--/test/Example
--/test/Example 2
--/test/Sample Directory Inside (2018)
--/test/Sample & Test Directory
--/test/Sample/Inside Directory
Это должно найти все каталоги в тестовом месте / менее чем 50 МБ в размере и удалить тот каталог. Заранее спасибо за Вашу помощь.
Использование остроты 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).Вот простой сценарий 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