如何删除目录中总大小小于 50 MB 的所有文件夹?目录名称中有空格和特殊字符,但没有换行符。目录内可能有子目录,因此我只需要第一级目录的大小并查找总大小小于 50 MB 的文件。
Directory Example:
/test
--/test/Example
--/test/Example 2
--/test/Sample Directory Inside (2018)
--/test/Sample & Test Directory
--/test/Sample/Inside Directory
它应该会找到 /test 位置中所有大小小于 50 MB 的目录并删除该目录。提前感谢您的帮助。
答案1
这是一个简单的 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
答案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 字节(50M),则删除。