如何一起使用“convert”和“xargs”?

如何一起使用“convert”和“xargs”?

我需要将一堆.rgb文件转换为.pngs (每个文件应保留其原始名称)。

我想了解如何转换第一个文件,然后将命令包装在“for”循环中。

这是我到目前为止所拥有的:

find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png

但这是行不通的。

我怎样才能让convert命令识别第二个参数zzzzz.png

答案1

如果你想转换目录树中的所有文件,我会运行:

find . -name '*.rgb' | parallel convert {} {.}.png

这将并行运行:

convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png

这里我使用 GNU Parallel 来利用你所有的 CPU。根据您的系统,您可以将其安装为软件包,否则它就在这里gnu.org/software/parallel。在 Debian 中是:

apt-get install parallel

编辑:
这是一个没有的解决方案GNU Parallel

find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;

和一个不太好的解决方案使用while..read

find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done

答案2

要转换(在我的情况下调整大小)我使用的单个目录中的所有图像

ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}

请注意文件名的花括号占位符可以使用两次。您还可以使用它向目标文件名添加前缀。

对于递归搜索:

find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}

答案3

我找到了答案:

for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it 
#in $filename.

'find . -name "*.rgb" | sort | sed -n 
\$i\p |  xargs -I {} convert {} 
\$filename.png'
done

相关内容