디렉토리에서 스크립트를 재귀적으로 실행하는 방법

디렉토리에서 스크립트를 재귀적으로 실행하는 방법

다음 코드를 사용하여 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 "{}" "{}" \;

무슨 일이 일어났는지 봐

dcmdjpegcommand를 command로 바꾸고 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

위에서 발견된 각 파일의 파일 이름이 두 번 에코되는 것을 볼 수 있습니다.

관련 정보