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 find
comando tem uma opção para isso. É chamado -exec
.
$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;
Isso substituirá os nomes dos arquivos conforme encontrados find
nos 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 dcmdjpeg
pelo comando echo
e executar o acima para ver os nomes dos arquivos que serão executados.
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.