2015-06-15 150 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来测试相应的文件是否存在。

相关问题