Как я могу запустить сценарий рекурсивно в каталоге

Я использую следующий код для декодирования сжатых JPEG DICOM.

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

Я запускаю этот код внутри любой папки, содержащей эти файлы.

Проблема в том, что у меня есть родительская папка и список подпапок внутри этой родительской папки. Каждая подпапка содержит не менее 2000 DICOM (Файл). Как я могу применить этот код один раз внутри родительской папки, который будет выполняться во всех подпапках одновременно?

Команда 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 

И теперь, когда мы запускаем второй пример, который обрабатывает пробелы в именах файлов:

 $ 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 

В приведенном выше примере вы можете видеть, что имена файлов повторяются дважды в каждом найденном файле.