2010-11-30 5 views
2

Ich habe eine Reihe von Ordnern mit den Namen 10, 12, 13, 14, 18, 24 usw. Sie ändern keine Zahlen in einem Standard-Inkrement. Ich muss dann wiederholt in die Ordner bewegen und dann in die nächste führen SVN Befehle, die die gleichen, außer für einige veränderbarer Ausdehnung sind zB:Bash-Skript zum Durchlaufen von definierten Dateinamen und Ausführen von Befehlen

/home/boy$ cp /home/files/*Session10.* . ; svn add *Session10.*; svn commit; cd ..; cd 12; 

Dann wird der nächste Befehl ist analog:

/home/boy$ cp /home/files/*Session12.* . ; svn add *Session12.*; svn commit; cd ..; cd 14; 

Also sollte ein Array oder eine Liste definiert werden, und dann eine for-Schleife durch diese Liste, und dann eine Variable, deren Name erweitert wird, um in die cp und svn Befehl eingespeist werden. Irgendwelche Gedanken? Ich hoffe, dass es in der Eingabeaufforderung und nicht in einer Bash-Skriptdatei erfolgen kann.

Antwort

1

Wenn die Liste vordefiniert ist und Sie nicht über jedes existierende Verzeichnis iterieren (mit anderen Worten, wenn ein Verzeichnis mit dem Namen 99 vorhanden ist, aber nicht in Ihrer Liste enthalten ist), können Sie über die Liste iterieren :

list="10 12 13 14 18 24"; for dir in $list; do cd "$dir"; do_something "foo $dir bar"; done 

oder ein Array:

array=(10 12 13 14 18 24); for idx in ${!array[@]}; do cd "${array[idx]}"; do_something "foo ${array[idx]} bar"; done 

Sie können wie folgt aus vorherigen oder nächsten Array-Elemente tun: ${array[idx-1]} oder ${array[idx+1]}, wenn Sie geeignete Kontrollen zu tun, um sicherzustellen, versuchen Sie nicht, ein Element abrufen mit einem Negativ Der Index (ein Index hinter dem letzten Element gibt eine Null zurück).

oder:

array=(10 12 13 14 18 24); for dir in ${array[@]}; do cd "$dir"; do_something "foo $dir bar"; done 

die über im Wesentlichen die gleiche wie die Liste Beispiel.

1

base=$PWD; for num in *; do cd $base/$num; cp /home/files/*Session${num}.* .; svn add *Session${num}.*; svn commit; done

+0

und was ist PWD? Ist das ein Array, das irgendwann früher eingerichtet wurde? und in "for num in *" adressiert der Asterix automatisch den Satz von Erweiterungsnamen? Danke – Vass

+1

@Vass '$ PWD' ist" vorhandenes Arbeitsverzeichnis ". Es wird automatisch von bash gesetzt. Das erste '*' ist das Muster, das Ihren Ordnern entspricht. Möglicherweise müssen Sie es durch etwas spezifischeres ersetzen, wie '[0-9] [0-9]' oder '[0-9] * [0-9]'. –

+0

'*' wird sowohl Dateien * und * Verzeichnisse übereinstimmen. Aus diesem Grund habe ich '[0-9] [0-9] /' verwendet, um nur die Verzeichnisse zu finden. Natürlich müssen Sie dann den nachgestellten '\\ 'im Var-Namen entfernen, den ich mit der Parametererweiterung gemacht habe. – SiegeX

2

Die Klacks Weg ist:

for dir in [0-9][0-9]/; do 
    cd "$dir" 
    cp /home/files/*Session${dir%/}.* . 
    svn add *Session${dir%/}.* 
    svn commit 
    cd .. 
done 

Dies wird nur Iterierte über Verzeichnisse, die aus zwei Ziffern bestehen.

1

Zeit für die findbasierte Lösung.

find . -maxdepth 1 -regextype posix-extended -type d -regex '.*/[0-9]{2}$' -exec \ 
    bash -c 'dir=${1##*/} 
    cd $1 
    cp /home/files/*Session{$dir}.* . 
    svn add *Session${dir}.* 
    svn commit' -- {} \; 

EDIT: jetzt mehr findy als je zuvor.

Verwandte Themen