2012-03-26 156 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