次のコードを使用してJPEG圧縮DICOMをデコードします。
find ./* -maxdepth 0 -name '*.dcm' -printf 'dcmdjpeg %p %p \n' | sh
このファイルを含むすべてのフォルダでこのコードを実行します。
問題は、親フォルダとその親フォルダ内にサブフォルダのリストがあることです。各サブフォルダには少なくとも2000個のDICOM(ファイル)が含まれています。このコードを親フォルダに一度適用してすべてのサブフォルダで同時に実行するにはどうすればよいですか?
ベストアンサー1
このfind
コマンドにはスイッチがあります。それは知られています-exec
。
$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;
これにより、find
見つかったファイル名がに置き換えられます{}
。したがって、上記はすべてのファイル名に対してこれを行います。
dcmdjpeg file1.dcm file1.dcm
dcmdjpeg file2.dcm file2.dcm
...
ファイル名にスペースが含まれている場合は、次の方法を使用できます。
$ find . -name '*.dcm' -exec dcmdjpeg "{}" "{}" \;
何が起こったのか見て
dcmdjpeg
commandをcommandに置き換えてecho
上記のコマンドを実行すると、実行するファイル名を確認できます。
このサンプルデータがあるとしましょう。
$ 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
次に、ファイル名のスペースを処理する2番目の例を実行すると、次のようになります。
$ 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
上記の各ファイルのファイル名が2回エコーされることがわかります。