Como posso executar um script recursivamente em um diretório

2

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 corro este 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 2000 DICOM (File). Como posso aplicar esse código uma vez dentro da pasta pai para ser executado em todas as subpastas ao mesmo tempo?

    
por Gilles 16.10.2014 / 04:21

1 resposta

2

O comando find tem um comutador para isso. É chamado -exec .

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

Isso substituirá nomes de arquivos encontrados por find nos locais em que houver {} . Então, acima, faremos isso para cada nome de arquivo.

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

Se houver espaços em seus nomes de arquivos, você poderá usar este método:

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

Vendo o que está acontecendo

Você pode trocar o comando dcmdjpeg com o comando echo e 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 lida com 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 nomes de arquivos sendo exibidos duas vezes por arquivo encontrado.

    
por 16.10.2014 / 05:17