我运行此命令来查找最大的文件:
du -Sh | sort -rh | head -5
Run Code Online (Sandbox Code Playgroud)
那我就这么做了-rm rf someFile。
有没有办法自动删除从前一个命令找到的文件?
如果你使用 GNU 工具(这是 Linux 上的标准工具),你可以这样做:
stat --printf '%s\t%n\0' ./* |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
Run Code Online (Sandbox Code Playgroud)
(测试后删除“回声”)。
该stat命令打印出当前目录中每个文件的文件大小和名称,以制表符分隔,每个记录以 NUL (\0) 字节结尾。
该sort命令按相反的数字顺序对每个以 NUL 结尾的记录进行排序。该head命令仅列出前五个此类记录,然后cut从每个记录中删除文件大小字段。
最后xargs采用该(仍然以 NUL 结尾)输入并将其用作 的参数echo rm -f。
因为它使用 NUL 作为记录(文件名)终止符,所以它可以处理其中包含任何有效字符的文件名。
如果您想要最小文件大小,那么您可以在和awk之间插入或其他内容。例如statsort
stat --printf '%s\t%n\0' ./* |
awk 'BEGIN {ORS = RS = "\0" } ; $1 > 25000000' |
sort -z -rn | ...
Run Code Online (Sandbox Code Playgroud)
注意:GNUawk没有-zNUL 终止记录的选项,但允许您将记录分隔符设置为您想要的任何内容。我们必须将输出记录分隔符 (ORS) 和输入记录分隔符 (RS) 设置为 NUL。
这是另一个版本,它用于find显式地将自身限制为仅指定目录中的常规文件(即排除目录、命名管道、套接字等)(-maxdepth 1没有子目录),这些文件的大小大于 25M(不需要awk)。
这个版本不需要,stat因为GNUfind也有一个printf功能。顺便说一句,请注意格式字符串的区别 -stat用于%n文件名,而find使用%p.
find . -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
Run Code Online (Sandbox Code Playgroud)
要针对不同的目录运行它,请替换.find 命令中的 。例如find /home/web/ ....
shell脚本版本:
#!/bin/sh
for d in "$@" ; do
find "$d" -maxdepth 1 -type f -size +25M -printf '%s\t%p\0' |
sort -z -rn |
head -z -n 5 |
cut -z -f 2- |
xargs -0 -r echo rm -f --
done
Run Code Online (Sandbox Code Playgroud)
将其保存为例如delete-five-largest.sh路径中的某个位置并运行它delete-five-largest.sh /home/web /another/directory /and/yet/another
这将为命令行上指定的find ... 每个目录运行一次。这与使用多个路径参数运行一次不同(find看起来像,脚本中find "$@" ...没有任何循环)。for它会删除每个目录中 5 个最大的文件,而在不使用 for 循环的情况下运行它只会删除搜索所有目录时找到的 5 个最大文件。即每个目录五个与总共五个。
使用最新的 GNU 工具(您已经在使用 GNU 特定选项):
du -S0 . |sort -zrn | sed -z 's@[^/]*@.@;5q' | xargs -r0 echo rm -rf
Run Code Online (Sandbox Code Playgroud)
(echo如果高兴就删除)。
/是为了能够复制具有任意名称的文件/目录-0。-z
请注意,大多数rm实现将拒绝删除.(当前工作目录),因此您可能需要从上一级执行此操作并执行以下操作:
du -S0 dir | sort -zrn | sed -z 's@\s*\d+\s*@@;5q' | xargs -r0 echo rm -rf
Run Code Online (Sandbox Code Playgroud)
因此,如果这是最大的文件之一,它可以删除dir(请注意,它也会删除所有子目录)。从您的要求来看,并不清楚这是否真的是您想要的。
现在,如果您想要删除 5 个最大的常规文件(不包括目录、设备、符号链接等其他类型的文件...),只需使用zshand 即可:
echo rm -f ./**/*(D.OL[1,5])
Run Code Online (Sandbox Code Playgroud)
(OL是按长度(大小,而不是磁盘使用情况)进行反向排序)。