2010-05-02 135 views
2

我有我的Linux系统上的以下的GIF:运行程序多次使用一个行shell命令

$ 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输出文件

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

回答

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 
+0

谢谢,这正是我所寻找的。我结束了使用以下命令: 找到。 -name * .gif -exec ./convert -i {} -o {} .bmp \; 唯一的问题是,我的输出文件的扩展名为.bmp.gif,但至少它的工作原理:) – 2010-05-02 18:00:26

+1

好的单线tonio。 .gif.bmp问题是为什么我通常会用额外的行来提取基本文件名并更改扩展名。 – 2010-05-02 18:10:09

+1

@teehoo:后缀问题的答案是编写一个shell脚本来覆盖转换器:'exec ./gif2bmp -i“$ 1”-o“$ {1%.gif} .bmp”'。然后你从'find'运行它:'find。 -name'* .gif'-exec ./wrapper {} \;'。 – 2010-05-02 18:10:28

1

使用GNU并行,你可以这样做:

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

增加的好处是它将并行地为每个cpu核心运行一个作业。

手表简要介绍介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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

+0

有趣的是,感谢您的信息 - 它不是默认的Debian Jessie安装上的标准工具,但:( – 2014-01-19 00:19:15

+1

看看你的借口是否覆盖http://oletange.blogspot.dk/2013/04/why-not-install- GNU-parallel.html – 2014-01-19 12:44:40