2010-05-02 112 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