2015-07-05 27 views
1

我的意思是一些命令subtitutions。在過去,我能夠使用猛砸,反引號時,例如我不得不線下載的,其曾在一個文本文件中已經已經收集的文件/鏈接,線路列表:如何將相同的命令應用於Bash中的文件列表?

wget `cat list.txt` 

甚至megadl到從大型下載:

megadl `cat list.txt` 

不幸的是,它不能正常工作,因爲某些原因。我將整個文件列表看作是由空格分隔的一長串文本,而不是換行符。

我經常寫小腳本,它只能處理一個參數,它是一個文件,而不是文本列表中列出的文本文件。當然,我不想修改我的腳本,因爲Bash提供了這種幫助機制,將相同的命令應用於文件列表,例如在「ls -1 * .jpg」的輸出上。我有一個名爲「cgamma」的小型實用程序,它將伽馬校正應用於圖像文件,同時保持顏色飽和度(它簡單地稱爲imagemagick的mogrify)。我想用它在許多圖像文件,像這樣:

cgamma `ls -1 *.jpg` 1.3 

我知道我可以使用一個for循環一行程序,但它更打字:

for $i in $(ls -1 *.jpg);do cgamma $i 1.3;done 

所以我的問題是,我如何正確使用反引號,命令替換,處理文件列表,並將相同的命令應用於所有這些命令?

回答

3

您可以使用xargs

printf '%s\0' *.jpg | xargs -0 -I {} cgamma '{}' 1.3 
1

實際上,你可以縮短你的推測for循環利用bash爲你做文件名匹配 - 而不是解析的ls的輸出,最好避免:

for i in *.jpg; do cgamma "$i" 1.3; done 

這實際上比您接受的解決方案短:-)

此外,您c烏爾德使用GNU Parallel不僅使命令更短,但也有他們的所有伽瑪校正並行和利用一切你支付了高價那些可愛的英特爾內核的;-)

parallel cgamma {} 1.3 ::: *.jpg 
+0

THX,我接受xargs回答是因爲它對我來說是新的,我不知道這個實用程序有什麼好處。 – Konstantin

相關問題