ディレクトリ内でスクリプトを再帰的に実行するにはどうすればよいですか

ディレクトリ内でスクリプトを再帰的に実行するにはどうすればよいですか

JPEG 圧縮された DICOM をデコードするために次のコードを使用しています。

find ./* -maxdepth 0 -name '*.dcm' -printf 'dcmdjpeg %p %p \n' | sh

これらのファイルを含むフォルダー内でこのコードを実行します。

問題は、親フォルダーと、この親フォルダー内のサブフォルダーのリストがあることです。すべてのサブフォルダーには、少なくとも 2000 個の DICOM (ファイル) が含まれています。このコードを親フォルダー内で 1 回適用して、すべてのサブフォルダーで同時に実行するにはどうすればよいですか?

答え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コマンドを コマンドに置き換えて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 回エコー出力されていることがわかります。

関連情報