如何在目錄中遞歸運行腳本

如何在目錄中遞歸運行腳本

我正在使用以下程式碼來解碼 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

在上面,您可以看到每個找到的檔案的檔案名稱被回顯兩次。

相關內容