2016-04-29 16 views
1

Ich bin neu in der Codierung und versuche, durch Ordner zu durchlaufen, um eine bestimmte Datei (die gleiche Sache in jedem Ordner genannt) zu finden. Ich habe 3 Ordner (CONTROL, GROUP1 und GROUP2). Jeder Ordner enthält 2 Unterordner von den Ordnernamen (2 3 4 5 6 7). Jeder Unterordner enthält eine Datei mit dem Namen des Unterordners wie 2_diff.nii oder 3_diff.nii. Ich möchte, dass der Code in jeden Ordner geht Ordner, finde die Unterordner und führe dann eine Analyse der darin enthaltenen Datei durch Das Problem ist, dass mein Code anscheinend nach jedem Unterordner in jedem Hauptordner sucht und jeder Hauptordner nur 2 Unterordner von (2 3 4 5 6 7) würden Irgendwelche Tipps sehr geschätzt -. danke !!Iterieren durch Ordner für bestimmte Dateien in BASH

Folders=(CONTROL GROUP1 GROUP2) 
SubFolders=(2 3 4 5 6 7) 

data_source=/Users/sheena/Desktop/test/ 

for j in ${Folders[@]}; do 
    cd ${data_source}/${j}/ 
    for i in ${SubFolders[@]}; do 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 #I want to analyze the file <subfolder>_diff.nii and name the output as <subfolder>_nodif.nii 
    done 
done 

Antwort

0

So wie ich verstehe Ihre Frage ist, dass die Verzeichnisse in jedem CONTROL, GROUP1 und GROUP1 gibt es zwei Dateien des Formulars x_diff.nii wobei x eine Ziffer zwischen 2 und 7 ist. Zumindest so Ich habe deinen Code gelesen.

Sie wissen nicht im Voraus, welche zwei Ziffern vorhanden sind.

Der einfachste Weg, ich es sehe, ist durch alle möglichen SubFolders wie Sie tun, aber verwenden Sie die continue Anweisung früh zu springen, um zum nächsten zu laufen, wenn sie nicht vorhanden ist:

Folders=(CONTROL GROUP1 GROUP2) 
SubFolders=(2 3 4 5 6 7) 

data_source=/Users/sheena/Desktop/test/ 

for j in ${Folders[@]}; do 
    cd ${data_source}/${j}/ 
    for i in ${SubFolders[@]}; do 
    if [[ ! -e ${i}_diff.nii ]]; then 
     continue 
    fi 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 
    done 
done 

Sie die ersetzen könnte if Klausel oben mit einer einzigen Zeile:

for i in ${SubFolders[@]}; do 
    [[ -e ${i}_diff.nii ]] || continue 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 
    done 

Aber ich finde den ausdruck if-fi leichter blockieren zu lesen und zu verstehen, und das ist auch wichtig.

+0

Hallo, vielen Dank für Ihre Antwort. Ich kannte den Continue-Befehl nicht, aber es funktionierte wunderbar! – Sheenas

+0

Nun, da ich es anschaue, frage ich mich, warum ich das Offensichtliche nicht gemacht habe und die Befehlszeile 'fslroi' in den 'if'-Block gesetzt habe. Dann hätte ich das 'continue' nicht gebraucht. Wie auch immer, wenn es funktioniert, funktioniert es. – chw21

Verwandte Themen