使用一行shell命令多次运行程序

时间:2010-05-02 17:52:50

标签: command-line shell

我的linux系统上有以下gif:

$ find . -name *.gif
./gifs/02.gif17.gif
./gifs/fit_logo_en.gif
./gifs/halloween_eyes_63.gif
./gifs/importing-pcs.gif
./gifs/portal.gif
./gifs/Sunflower_as_gif_small.gif
./gifs/weird.gif
./gifs2/00p5dr69.gif
./gifs2/iss013e48788.gif
...and so on

我所写的是一个程序,它使用以下界面将GIF文件转换为BMP:

./ gif2bmp -i inputfile -o outputfile

我的问题是,是否可以使用xargs,awk,find等编写一行命令来为这些文件中的每一个运行一次程序?或者我是否必须编写带循环的shell脚本?

2 个答案:

答案 0 :(得分:3)

对于这类工作,可能值得查看find手册页,尤其是-exec选项。

你可以写下以下内容:

find . -name *.gif -exec gif2bmp -i {} -o {}.bmp \;

您可以使用dirnamebasename的组合来获得更好的输出文件命名,但在这种情况下,我更喜欢使用shell for循环,类似于:

for i in `find . -name "*.gif"`; do
  DIR=`dirname $i`
  NAME=`basename $i .gif`
  gif2bmp -i $i -o ${DIR}/${NAME}.bmp
done

答案 1 :(得分:1)

使用GNU Parallel,您可以:

parallel ./gif2bmp -i {} -o {.}.bmp ::: *.gif

额外的好处是它将为每个cpu核心并行运行一个作业。

观看介绍视频,快速了解:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程(http://www.gnu.org/software/parallel/parallel_tutorial.html)。你命令行爱你。