디렉토리의 모든 폴더에 대해 명령을 실행하는 방법은 무엇입니까?

디렉토리의 모든 폴더에 대해 명령을 실행하는 방법은 무엇입니까?

다음과 같은 구조의 디렉터리가 있다고 가정해 보겠습니다.

project/
├── folder1/
│   └── mainline
|       └── ...
├── folder2/
│   └── mainline
|       └── ...
├── folder3/
│   └── mainline
|       └── ...
.
.
.
└──folderN/
    └── mainline
        └── ...

각 폴더 ant clean에서 명령을 실행 하고 싶습니다 . mainline어떻게 해야 하나요?

답변1

표시된 디렉터리 계층 구조의 ant clean모든 디렉터리에서 실행 한다고 가정합니다.mainline

for mainline in project/folder*/mainline/; do
    ( cd "$mainline" && ant clean )
done

mainline이것은 각 디렉토리의 경로 이름을 반복합니다 . 이러한 각 경로 이름에 대해 루프 본문은 해당 디렉터리로 변경되어 ant clean그 디렉터리에서 실행됩니다.

루프 내 명령 주위의 괄호는 하위 쉘의 명령을 실행합니다. 작업 디렉토리에 대한 변경 사항은 해당 하위 쉘에 대해 로컬입니다( cd입력한 디렉토리를 "종료"할 필요는 없습니다 ).


mainline표시되는 디렉토리가 다음과 같은 경우오직디렉토리이면 find다음과 같이 사용할 수 있습니다.

find project -type d -name mainline -execdir sh -c 'cd mainline && ant clean' \;

이것은 찾을 것이다어느mainline아래에서 호출된 디렉터리는 각 디렉터리에서 실행됩니다 project. ant clean-execdir작업은 비표준이지만 일반적으로 find대부분의 Unices의 유틸리티에 의해 구현됩니다.

build.xml기본적으로 사용되는 파일을 찾아 해당 파일이 포함된 모든 디렉터리에서 실행할 수도 있습니다 .antant cleanmainline

find project -type f -path '*/mainline/build.xml' -execdir ant clean \;

답변2

이와 같이:

$ cd project/
$ find . -type d -name "mainline" -exec ls -l {} \;

그러면 현재 폴더(project/)에서 "mainline"이라는 디렉터리를 찾아 ls -l각 디렉터리에서 실행합니다.

관련 정보