Direkte rekursive Shell-Skriptausgabe in jedes Unterverzeichnis, nicht in das übergeordnete Verzeichnis

Direkte rekursive Shell-Skriptausgabe in jedes Unterverzeichnis, nicht in das übergeordnete Verzeichnis

Ich verarbeite einen Stapel von Betreffdaten rekursiv und rufe das Skript im übergeordneten Verzeichnis auf.

Beispielsweise habe ich das übergeordnete Verzeichnis:

/home/subjects

und die Unterverzeichnisse, die die Daten enthalten:

/home/subjects/0393
/home/subjects/0389
/home/subjects/9920 (Around 250 subjects)

Jede Datei in jedem Unterverzeichnis hat die Dateierweiterung „.nii“. Ich habe einen Code zusammengestellt, der eine Reihe von Befehlen aus einem neurowissenschaftlichen Programm aufruft und nach dieser bestimmten Dateierweiterung als Eingabe sucht. Die Eingabe für den ersten Befehl „fslroi“ ist die .nii-Datei ($file), während die Ausgabedatei dieses Befehls „rawdata.nii“ ist. Wie Sie sehen, ist die Ausgabe eines Befehls die Eingabe für den nächsten usw.

for file in $(find ./ -name "*.nii")
do
fslroi $file rawdata.nii 0 33
gunzip rawdata.nii.gz -f
fslroi rawdata.nii rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done

Dieser Code ist jedoch unzureichend, da ich die Ausgabe nicht in dem entsprechenden Unterverzeichnis speichern kann. Da ich mehrere Themen bearbeite, funktioniert der Code daher nicht, da alles im übergeordneten Verzeichnis gespeichert wird.

Kann mir bitte jemand einen Hinweis geben, wie ich den Code ändern kann, um die Ausgabe entsprechend der Eingabedatei „.nii“ zu speichern?

Antwort1

Sie möchten dirname $fileden Verzeichnisnamen Ihrer Eingabedatei abrufen und diesen dem Ausgabedateinamen voranstellen.

for file in $(find ./ -name "*.nii")
do
rawdata = $(dirname $file)/rawdata.nii
fslroi $file $rawdata 0 33
gunzip $rawdata.gz -f
fslroi $rawdata rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done

Es ist unklar, welche davon rawdatatatsächliche Befehlsargumente sind oder ob es sich bei allen um Dateinamen handelt. Dasselbe gilt für rawnodif_brain_maskdas, was Sie möglicherweise auf die gleiche Weise anpassen müssen.

Antwort2

Vielen Dank, hier ist das fertige Skript. Beachten Sie, dass das $ einen Dateinamen bezeichnet, während der Rest Befehle oder Argumente sind.

#!/bin/bash

for file in $(find ./ -name "*.nii")
do
rawdata=$(dirname $file)/rawdata.nii.gz
rawnodif=$(dirname $file)/rawnodif.nii.gz
rawnodif_brain=$(dirname $file)/rawnodif_brain.nii.gz
rawnodif_brain_mask=$(dirname $file)/rawnodif_brain.nii.gz
fslroi $file $rawdata 0 33
fslroi $rawdata $rawnodif 0 1
gunzip $rawdata -f
bet $rawnodif $rawnodif_brain -m -g 0.2 -f 0.3
fslmaths $rawnodif -mas $rawnodif_brain_mask $rawnodif_brain
gunzip $rawnodif_brain_mask -f
done

verwandte Informationen