如何在目录中递归运行脚本

如何在目录中递归运行脚本

我使用以下代码来解码 JPEG 压缩的 DICOM。

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

在上面,您可以看到每个找到的文件的文件名被回显两次。

相关内容