首页 > 解决方案 > 系统中最大的文件并在 unix 中移动

问题描述

我是 bash 新手,我正在为此苦苦挣扎。我有一个任务,问题是

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

我尝试使用以下代码

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

我得到列表,但我无法移动..

请提出建议

标签: bashunix

解决方案


看起来像一个简单的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或前。添加echo以查看发生了什么:xargs -I{} -t echo mv {} /tmp

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

{ 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

推荐阅读