系统中最大的文件,并将其移至Unix

时间:2019-07-18 06:33:04

标签: bash unix

我是bash的新手,并对此感到挣扎。我有一个任务是问题

尝试查找整个文件系统中按大小排序的前5个较大文件,然后将文件移至/ tmp文件夹,并使用当前日期时间格式重命名该文件

我尝试了以下代码

du -a /sample/ | sort -n -r | head -n 5

我正在获取列表,但我无法移动。.

请提出建议

1 个答案:

答案 0 :(得分:1)

就像一个简单的xargs案例:

du -a /sample/ | sort -n -r | head -n 5 | xargs -I{} mv {} /tmp

xargs在这里只是从标准输入中读取行并将它们作为参数附加到命令mv中。因为指定了-I{},所以用{}替换了xargs字符串作为参数。因此mv {} /tmp被执行为mv <the first file> /tmpmv <the second file> /tmp,依此类推。你可以将-t选项添加到xargs或ex。添加echo以查看发生了什么:xargs -I{} -t echo mv {} /tmp

我们可以在流的末尾添加/ tmp而不是运行5个进程,并且仅运行一个mv命令:

{ du -a /sample/ | sort -n -r | head -n 5; echo /tmp; } | xargs mv

或类似的

du -a . | sort -n -r | head -n 5 | { tee; echo /tmp; } | xargs mv

请注意,使用du -a可能不适用于带有特殊字符,空格,制表符和换行符的文件名。它还将在其输出中包含目录。如果只想过滤文件,请移至更安全的find

find /sample/ -type f -printf '%s\t%p\n' | sort -n -r | cut -f2- | head -n5 | xargs -I{} mv {} /tmp

首先,我们以字节为单位打印每个文件名。然后,我们对流进行数字排序。然后我们删除大小,即。在第一个'\t'表格上剪切流。然后我们得到head -n5行。最后,我们用xargs复制。它适用于文件名中没有特殊字符的文件名,例如不可读的字节,空格,换行符和制表符。

对于这种特殊情况,最好使用find并处理零终止的字符串,例如这样(请注意仅添加-z-0选项):

find /sample/ -type f -printf '%s\t%p\0' | sort -z -n -r | cut -z -f2- | head -z -n5 | xargs -0 -I{} mv {} /tmp