2012-03-26 201 views
2

我试图创建一个shell脚本,它将根据一些规则转换某些文件。这些文件被组织这样的:shell脚本循环遍历文件名从0000到1500

file_0000.adat 
file_0001.adat 
file_0002.adat 
file_0003.adat 
... 
file_0010.adat 
file_0011.adat 
... 
file_9999.adat 

我现在的剧本是这样的:

#!/bin/sh 

lauf=$(expr 0) 

for filename in ../distData/file_*.adat 
do 
    ... 
    lauf=$(expr $lauf + 1) 
done; 

但现在我只想从0000号文件到1500。我需要的数中的转换该文件(由脚本中的变量lauf完成)。现在无法弄清楚如何做到这一点。

感谢您的回复。

回答

8

尝试类似:

for i in $(seq -w 1500) ; do 
    if [ -f ../distData/file_${i}.adat ] ; then 
    # do whatever, the file number is ${i} 
    fi 
done 
+0

完美,谢谢 – Haatschii 2012-03-26 11:15:17

+0

好的!在'seq'中不知道'-w'。我在'man seq'中看到“通过填充与前导零来均衡宽度”。 – fedorqui 2014-06-12 10:11:58

2

我想是这样的,生成文件的编号模式。 你可以把代码的其它部分与文件名来连接和搜索文件名

START=0 
MAX=1500 
while [ $START -le $MAX ] 
do 
    PAT=$(printf "%04d" $START) 
    echo $START $PAT 
    START=`expr $START + 1` 
done 
0
FILES=$(ls ../distData/file_{0000..1500}.adat 2>/dev/null) 
for FILE in ${FILES[@]}; do 
    #$FILE exists, do what you want 
done 

stderr/dev/null重定向是抑制输出消息在文件范围不存在

+0

最好在'../ distData/file_ {0000..1500} .adat'中写'for file,尤其是对于可能包含空格的模式。 – 2012-03-26 13:08:12

+0

但是你必须做'-f'检查,所以它不一样。设置'IFS'怎么办? – 2012-03-26 14:14:11

+0

对,好点。 – 2012-03-26 14:25:16