2012-03-26 9 views
2

Ich versuche, ein Shell-Skript zu erstellen, das bestimmte Dateien nach bestimmten Regeln konvertieren soll. Die Dateien werden wie folgt organisiert:Shell-Skript-Schleife über Dateinamen von 0000 bis 1500

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

Meine aktuelle Skript sieht wie folgt aus:

#!/bin/sh 

lauf=$(expr 0) 

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

Aber jetzt will ich nur die Dateien mit den Zahlen von 0000 bis 1500. Für die Umwandlung Ich brauche die Anzahl der die Datei (erledigt durch die Variable lauf im Skript). Ich kann jetzt nicht herausfinden, wie ich das machen soll.

Danke für die Antworten.

Antwort

8

Probieren Sie etwas wie:

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

perfekt, danke – Haatschii

+0

Gute Eins! Wusste nicht über "-w" in 'seq'. Ich sehe in 'man seq', dass" die Breite durch Auffüllen mit führenden Nullen ausgeglichen wird ". – fedorqui

2

habe ich versucht, so etwas wie dies die Anzahl Muster der Datei zu erzeugen. Sie den anderen Teil des Codes setzen können mit Dateinamen verketten und für die Dateinamen

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 

die Umleitung von stderr zu /dev/null suchen ist zur Ausgabe von Meldungen für Dateien im Bereich unterdrücken, die nicht exist

+0

Es ist viel besser, 'für Datei in ../ distData/file_ {0000..1500} .adat' zu schreiben, besonders für Muster, die Leerzeichen enthalten können. –

+0

aber dann musst du die '-f' Prüfung machen, also ist es nicht das selbe. Wie wäre es mit dem' IFS'? –

+0

richtig, guter Punkt. –

Verwandte Themen