Ich verwende den folgenden Code zum Dekodieren von JPEG-komprimierten DICOMs.
find ./* -maxdepth 0 -name '*.dcm' -printf 'dcmdjpeg %p %p \n' | sh
Ich führe diesen Code in jedem Ordner aus, der diese Dateien enthält.
Das Problem besteht darin, dass ich einen übergeordneten Ordner und eine Liste von Unterordnern innerhalb dieses übergeordneten Ordners habe. Jeder Unterordner enthält mindestens 2000 DICOM-Dateien. Wie kann ich diesen Code einmal im übergeordneten Ordner anwenden, damit er gleichzeitig in allen Unterordnern ausgeführt wird?
Antwort1
Der find
Befehl hat dafür einen Schalter. Er heißt -exec
.
$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;
Dadurch werden die von gefundenen Dateinamen find
an den Stellen ersetzt, an denen sie vorkommen {}
. Im obigen Beispiel werden wir dies also für jeden Dateinamen tun.
dcmdjpeg file1.dcm file1.dcm
dcmdjpeg file2.dcm file2.dcm
...
Wenn Ihre Dateinamen Leerzeichen enthalten, können Sie diese Methode verwenden:
$ find . -name '*.dcm' -exec dcmdjpeg "{}" "{}" \;
Sehen, was passiert
dcmdjpeg
Sie können den Befehl durch den Befehl ersetzen echo
und das obige ausführen, um die Dateinamen anzuzeigen, die ausgeführt werden.
Angenommen, ich hätte diese Beispieldaten.
$ tree
.
|-- 1
| |-- 1.dcm
| |-- 1\ space.dcm
| |-- 2.dcm
| `-- 3.dcm
|-- 1.dcm
|-- 2
| |-- 1.dcm
| |-- 1\ space.dcm
| |-- 2.dcm
| `-- 3.dcm
|-- 2.dcm
|-- 3
| |-- 1.dcm
| |-- 1\ space.dcm
| |-- 2.dcm
| `-- 3.dcm
`-- 3.dcm
Und jetzt führen wir das zweite Beispiel aus, das Leerzeichen in Dateinamen verarbeitet:
$ find . -name '*.dcm' -exec echo "{}" "{}" \;
./2.dcm ./2.dcm
./1/2.dcm ./1/2.dcm
./1/3.dcm ./1/3.dcm
./1/1 space.dcm ./1/1 space.dcm
./1/1.dcm ./1/1.dcm
./3.dcm ./3.dcm
./1.dcm ./1.dcm
./2/2.dcm ./2/2.dcm
./2/3.dcm ./2/3.dcm
./2/1 space.dcm ./2/1 space.dcm
./2/1.dcm ./2/1.dcm
./3/2.dcm ./3/2.dcm
./3/3.dcm ./3/3.dcm
./3/1 space.dcm ./3/1 space.dcm
./3/1.dcm ./3/1.dcm
Oben können Sie sehen, dass Dateinamen pro gefundener Datei zweimal ausgegeben werden.