删除名称中带有空格的 50 MB 以下的小文件夹

删除名称中带有空格的 50 MB 以下的小文件夹

如何删除目录中总大小小于 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
    
  • 先前版本的答案:https://askubuntu.com/revisions/1073858/2

答案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),则删除。

相关内容