Bash:用grep,awk和xargs移动一组特定大小的文件

时间:2014-03-19 21:08:47

标签: macos bash awk xargs mv

在工作中,我需要将图像上传到网站。它们不能超过300 KB。为了对准备上传的图像进行分组,我在Bash中设计了以下一行:

du -h * | grep "[0-2]..K" | awk '{print $2}' | xargs mv Ready/

但这不起作用,因为shell返回了以下内容:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

最后,我使用for循环来完成相同的操作:

for file in $(du -h * | grep "[0-2]..K" | awk '{print $2}')
do
    mv -v ${file} Ready/
done

有人可以解释为什么第一行不起作用?这可能是我很遗憾的事情,但我似乎无法找到它。

我使用的是Mac OS X 10.7,Bash 4.3版。

1 个答案:

答案 0 :(得分:3)

我会使用find命令来获取小于特定大小的所有文件,使代码更清晰,更易于阅读:

find . -size -300k -name *.png -exec mv {} Ready/ \;

第一个命令失败的原因是因为你必须引用你输入的值,因为它不在语句的末尾。这应该有效:

du -h * | grep "[0-2]..K" | awk '{print $2}' | xargs -0 -I {} mv {} Ready/