Как рекурсивно запустить скрипт в каталоге?

Как рекурсивно запустить скрипт в каталоге?

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

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

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

Связанный контент