我是bash的新手,并对此感到挣扎。我有一个任务是问题
尝试查找整个文件系统中按大小排序的前5个较大文件,然后将文件移至/ tmp文件夹,并使用当前日期时间格式重命名该文件
我尝试了以下代码
du -a /sample/ | sort -n -r | head -n 5
我正在获取列表,但我无法移动。.
请提出建议
答案 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> /tmp
和mv <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