
Estoy usando el siguiente código para decodificar DICOM comprimidos en JPEG.
find ./* -maxdepth 0 -name '*.dcm' -printf 'dcmdjpeg %p %p \n' | sh
Ejecuto este código dentro de cualquier carpeta que contenga esos archivos.
El problema es que tengo una carpeta principal y una lista de subcarpetas dentro de esta carpeta principal. Cada subcarpeta contiene al menos 2000 DICOM (archivo). ¿Cómo puedo aplicar este código una vez dentro de la carpeta principal para ejecutarlo en todas las subcarpetas al mismo tiempo?
Respuesta1
El find
comando tiene un interruptor para eso. Se llama -exec
.
$ find . -name '*.dcm' -exec dcmdjpeg {} {} \;
Esto sustituirá los nombres de archivos a medida que se encuentren find
en los lugares donde se encuentran {}
. Entonces, en lo anterior haremos esto para cada nombre de archivo.
dcmdjpeg file1.dcm file1.dcm
dcmdjpeg file2.dcm file2.dcm
...
Si hay espacios en los nombres de sus archivos, puede utilizar este método:
$ find . -name '*.dcm' -exec dcmdjpeg "{}" "{}" \;
viendo lo que esta pasando
Puede intercambiar el comando dcmdjpeg
con el comando echo
y ejecutar lo anterior para ver los nombres de archivos que se ejecutarán.
Digamos que tenía estos datos de muestra.
$ 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
Y ahora, cuando ejecutamos el segundo ejemplo que maneja espacios en nombres de archivos:
$ 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
En lo anterior, puede ver que los nombres de archivos se repiten dos veces por archivo encontrado.