2015-06-15 94 views
1

例如說我有:shell腳本遍歷用相同名稱的文件,但不同的擴展

filename1.ext1 filename1.ext2 filename2.ext1 filename2.ext2 

我需要寫一個shell腳本來將這些文件送入一個程序,像這樣:

program filename1.ext1 filename1.ext2 
program filename2.ext1 filename2.ext2 

此外,必須先輸入.ext1文件,然後再輸入.ext2文件。

任何幫助,將不勝感激。

+3

將其稱爲'程序文件名1。*'和'程序文件名2。*' – anubhava

回答

0

anubhava的解決方案是優秀的,如果,因爲他們在你的榜樣做,擴展到排序正確的順序。對於更一般的情況下,如果排序不能依靠,我們可以明確指定參數順序:

for f in *.ext1 
do 
    program "$f" "${f%.ext1}.ext2" 
done 

這會工作,即使文件名中都有空格或其他困難的字符。

+0

非常好,謝謝! – ethanpowell

0

腳本程序

#!/bin/bash 
for file in "[email protected]";do 
echo "$file" 
done 

運行程序:

path/to/program filename1.* 
path/to/program filename1.* filename2.* 
path/to/program filename1.ext1 filename1.ext2 
etc... 
+0

對不起,@符號的作用是什麼? – ethanpowell

+0

@ethanpowell它是從數組中獲取所有元素。 '$ {arr [@]}'是數組'$ arr'的所有元素。 – Jahid

0

有幾種方法可以解決這個問題。

如果你想處理your_script foo.a foo.b bar.a bar.b(對的序列參數):

#!/bin/bash 
while [[ $# -gt 2 ]]; do 
    program "$1" "$2" 
    shift 2 
done 

但是,如果你想在匹配名稱的列表,你甚至不需要採取第二套的擴展。調用此類似your_script foo.a bar.ayour_script *.a

#!/bin/bash 
for FILE1; do     # same as: for FILE1 in "[email protected]"; do 
    FILE2="${FILE1%.ext1}.ext2" # removes .ext1 if it exists and adds .ext2 
    program "$FILE1" "$FILE2" 
done 

注意的是,以上不處理丟失的文件。您可以使用if [[ -f $FILE2 ]]; then program; fi來測試相應的文件是否存在。

相關問題