我想找到所有小于 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
处理时,子目录已被删除,因此其大小将低于阈值,因此它也将被删除。您是否真的想要这样做取决于您到底想做什么。dir2
dir3
但这是一种过于简单的方法。请考虑以下场景:
$ 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/dir2
和dir1/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
之后将被处理dir2
,dir3
因此它将为空,未达到阈值并被删除。您是否想要这样做取决于您到底想做什么。
答案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