查找大小小于 x 的文件夹并删除它们

查找大小小于 x 的文件夹并删除它们

我想找到所有小于 100mb 的文件夹(文件夹内)并删除它们。我实际上不想使用 bash 脚本。但可能有一些简洁的单行循环可以做到这一点。但不幸的是我的 shell 知识不太好

我尝试过的方法

 du -sh * | grep -E "^[0-9]{1,2}M" | xargs -0 rm

这不起作用因为输出du -sh * | grep _E ".."似乎是一个字符串。

我也尝试过

find . -maxdepth 1 -type d -size 100M [-delete]

但我觉得这-size面旗帜不是我想要的

答案1

简单的方法是找到所有目录,获取其大小,如果它们低于给定的阈值,则删除它们:

find . -maxdepth 1 -type d | 
  while read dir; do [ $(du -s "$dir") -le 102400 ] && rm -f "$dir"; done

但是,如果目录名包含换行符或其他奇怪字符,则此方法会失败。更安全的语法是:

find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dir; do
    [ $(du -s "$dir") -le 102400 ] && rm -f "$dir"
done

由于这将在处理父目录之前处理子目录,因此在dir1处理时,子目录已被删除,因此其大小将低于阈值,因此它也将被删除。您是否真的想要这样做取决于您到底想做什么。dir2dir3


但这是一种过于简单的方法。请考虑以下场景:

$ tree -h
.
`-- [4.0K]  dir1
    |-- [4.0K]  dir2
    |   `-- [ 80M]  file1
    `-- [4.0K]  dir3
        `-- [ 80M]  file2

3 directories, 2 files

这里,我们在 下有 2 个子目录dir1,每个子目录包含一个 80M 的文件。上面的命令将首先查找dir1大小 >100M 的文件,因此不会删除它。然后它将查找dir1/dir2dir1/dir3并删除它们,因为它们小于 100M。最终结果将是一个空文件dir1,当然,由于它是空的,因此其大小将小于 100M。

因此,如果您只有一层子目录,此解决方案将正常工作。如果您有更复杂的文件结构,则需要考虑如何处理。一种方法是使用-depth确保首先显示子目录的方法:

find . -depth -maxdepth 1  -type d -print0 | while IFS= read -r -d '' dir; do
    [ $(du -s "$dir") -le 102400 ] && rm -f "$dir"
done

这样,dir1之后将被处理dir2dir3因此它将为空,未达到阈值并被删除。您是否想要这样做取决于您到底想做什么。

答案2

使用du标志-h来进行值比较通常不是一个好主意。

您正在寻找的命令是:

find . -maxdepth 1 -type d | grep -v ^\\.$ | xargs -n 1 du -s | while read size name ; do if [ $size -gt 104857600 ] ; then echo rm -rf $name ; fi done

解释:

  • find . -maxdepth 1 -type d查找当前目录的所有子目录
  • grep -v ^\\.$排除当前目录 (.)
  • xargs -n 1将它们逐一传递给下一个命令
  • du -s提供该目录中文件的摘要(即总计)空间
  • while read size name...done对其输入执行循环,读取每个目录的大小和名称
  • 其余部分或多或少是不言自明的。

对命令满意后,删除echo之前的rm -rf

相关内容