Como posso executar um script recursivamente em um diretório

Como posso executar um script recursivamente em um diretório

Estou usando o código a seguir para decodificar DICOMs compactados em JPEG.

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

Eu executo esse código dentro de qualquer pasta que contenha esses arquivos.

O problema é que tenho uma pasta pai e uma lista de subpastas dentro dessa pasta pai. Cada subpasta contém pelo menos 2.000 DICOM (Arquivo). Como posso aplicar esse código uma vez dentro da pasta pai para ser executado em todas as subpastas ao mesmo tempo?

Responder1

O findcomando tem uma opção para isso. É chamado -exec.

$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;

Isso substituirá os nomes dos arquivos conforme encontrados findnos locais onde existem arquivos {}. Então, acima, faremos isso para cada nome de arquivo.

dcmdjpeg file1.dcm file1.dcm
dcmdjpeg file2.dcm file2.dcm
...

Se houver espaços nos nomes dos arquivos, você pode usar este método:

$ find . -name '*.dcm' -exec dcmdjpeg "{}" "{}" \;

Vendo o que está acontecendo

Você pode trocar o comando dcmdjpegpelo comando echoe executar o acima para ver os nomes dos arquivos que serão executados.

Exemplo

Digamos que eu tenha esses dados de amostra.

$ 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

E agora, quando executamos o segundo exemplo que trata de espaços em nomes de arquivos:

$ 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

Acima você pode ver os nomes dos arquivos sendo repetidos duas vezes por arquivo encontrado.

informação relacionada