使用 awk 的输出作为 mv 的输入

使用 awk 的输出作为 mv 的输入

我正在尝试编写一个脚本(或单行)来查找所有尺寸较小的图像文件,然后将它们移动到一个目录中。基于这个答案来自 Ask Ubuntu,我能够生成两个维度都低于 500 的文件列表,然后我能够找到所有常见的图像文件以及.jpg

find -E . -regex ".*\.(jpg|gif|png|jpeg)" -type f -exec identify -format '%w %h %i\n' '{}' \; | awk '$1<500 && $2<500' | awk '{print $3}'

第二个awk是它只打印文件名,我希望在mv. 我怎样才能将该输出放入mv


第一个的示例输出awk是:

123 456 ./smallimage.jpg
333 333 ./square.png

第二个awk刚刚给出

./smallimage.jpg
./square.png

但是,我似乎找不到一种方法来获取此文件名列表作为mv命令的输入,因为所需的最终命令是某种形式mv <file list> ./small_images/

答案1

合并mvawk使用system()函数中:

awk '$1<500 && $2<500 {system("mv "$3" /destination")}

更改mv命令以满足您的需要,这里我使用了:

mv /file_(third_field)_from_awk /destination

另外,您不需要多个awks,只需一个就足够了,如上所示。

答案2

假设您的文件名没有嵌入换行符,您可以使用 GNUmvxargs程序来执行此操作。

 ... | awk ... | xargs -d'\n' mv -t ./small_images

xargs 从输入中收集文件名并将其附加到命令中mv -t ./small_images,根据需要分割很长的命令。您需要一个mv可以-t在命令开始时指定目标目录的版本,或者编写一个小脚本来处理它。

相关内容