是否可以使用xargs
运行多个命令?我找到的唯一相关信息这个问题是,但答案与 无关xargs
。
我正在运行一个简单的
du / -ah | sort -r -n | head -n 10 | awk '{print $2}'
查找占用磁盘空间最多的文件。但是,它还返回目录,我只想删除文件为了保持任何结构。
我厌倦了使用find
命令,因为我不确定是否可以按磁盘使用情况而不是文件大小进行搜索。
任何意见将不胜感激!
答案1
您可以用来find
仅获取常规文件并运行du
它们。下面的命令会抑制标准错误,因为如果您对根目录执行此操作,则可能会对某些特殊目录产生一些抱怨。这里-h
用于du
和sort
,这有利于排序显示文件大小。
find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head | cut -f2-
换行符还用作上述命令的文件分隔符。进入 GNU shell 的安全方法是使用空字节来分隔参数,例如:
find / -type f -exec du -h0 {} + 2>/dev/null | sort -zhr | head -z | cut -zf2- | xargs -r0 <some command to run for the 10 biggest files>
对于您的情况(/
以任何用户身份进行搜索),只需打印文件及其大小,然后决定要做什么。不要将结果直接发送到rm --
。
也可以看看:
答案2
目录是多种类型之一文件(常规、目录、符号链接、fifo、设备...)。也许你的意思是常规文件因为这是除了为其分配磁盘空间的目录之外的另一种类型的文件。
du / -ah | head -n 10 | sort -r -n | awk '{print $2}'
是错误的,因为使用-h
,您会得到 KMGT... 后缀,这意味着sort -n
不起作用。 GNU 实现sort
有一个-h
选项来解码这些后缀,但由于四舍五入,顺序可能仍然是错误的。
另请注意,硬链接仅计算一次,并且文件路径可能包含换行符而不是由文本组成。更不用说awk
返回第二个空格分隔字段将因包含空格的文件路径而阻塞。 0 是唯一不能出现在文件路径中的字节值,因此您希望使用 NUL 分隔的记录来表示文件列表。
-h
是一个 GNU 扩展。 GNU 实现可以使用或find
报告磁盘使用情况,因此您可以执行以下操作:-printf %b
-printf %k
find . -type f -printf '%b\t%p\0' |
sort -zrn |
numfmt -d $'\t' -z --to=iec --from-unit=512 |
tr '\0' '\n'
请注意,这tr
只是将其输出供人类使用,如果您想对该列表进行后处理,则需要保留 NUL 分隔的格式。例如,要删除 10 个最大(就磁盘使用情况而言)的文件:
find . -type f -printf '%b\t%p\0' |
sort -zrn |
head -zn10 |
cut -zf 2- |
xargs -r0 rm -f
(-printf
、-z
、-r
、-0
都是 GNU 扩展,尽管xargs -0
现在受到一些其他实现的支持;-r
以及在较小程度上)。
从技术上讲,rm
取消文件与其父目录的链接。您可能会发现该管道返回链接到 10 个不同目录的同一文件;然后,您可以取消它与它们的链接,但如果该文件仍然链接到更多目录,您将无法回收其空间。
如果您想删除前.
10 个最大文件下的目录中的所有条目(链接),您可以执行以下操作:
find . -type f -printf '%b\t%D:%i\t%p\0' |
sort -zrn |
gawk -F'\t' -v RS='\0' -v ORS='\0' '!seen[$2]++ && ++n > 10 {exit}1' |
cut -zf 3- |
xargs -r0 rm -f
¹ 请注意,对于类型的文件目录,du
报告目录文件本身的磁盘使用情况,以及它列出的任何唯一文件及其递归子目录的磁盘使用情况。