특정 확장자를 가진 파일이 포함된 하위 폴더에서 명령 실행

특정 확장자를 가진 파일이 포함된 하위 폴더에서 명령 실행

여러분, 안녕하세요,

특정 확장자를 가진 파일이 포함된 하위 폴더에서 명령을 실행하려고 합니다. 폴더 자체 내에서 명령을 실행하고 폴더 자체 내에서 출력을 생성하고 싶습니다.

이것은 내가 달성하고 싶은 것을 보여주는 그림입니다. 나는 이것부터 시작하겠습니다 :

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    └── file2.abc
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    └── file.def
    └── subfolder 4

이 경우 하위 폴더 1과 3을 찾아서 그 폴더에서 명령을 실행하고 싶습니다. 해당 명령의 출력도 아래와 같이 해당 폴더 안에 있습니다.

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

이 코드는 작동합니다. 내부에서 실행하세요 folder.

if ()(($#)) */*.(abc|def|ghi)(NY1-.); then

        for file (*/*.(abc|def|ghi)) command1 $file && command2 ${file} > $file.out && command3 * > subfolder.out
    else echo "No appropriate files found"
fi

그러나 폴더 안이나 폴더 내의 각 하위 폴더에 대한 파일을 생성하려고 할 때 command3해당 폴더 *안에 결과가 포함된 파일을 생성하고 싶습니다. 내가 얻은 것은 스크립트를 어디에서 실행하든 내가 원하는 폴더 안에 있는 대신 파일이 생성되고 덮어쓰여진다는 것입니다. 따라서 이 스크립트를 top 내부에서 실행하면 다음과 같은 결과를 얻습니다.*.(abc|def|ghi)subfolder.outfolder

.
└── folder
    ├── subfolder.out
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    └── file2.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    └── file.out
    └── subfolder 4

나는 그것이 다음과 같이 생성되기를 원한다.

.
└── folder
    ├── subfolder 1
    │    ├── file.abc
    │    ├── file.out
    │    ├── file2.abc
    │    ├── file2.out
    │    └── subfolder.out
    ├── subfolder 2
    │    └── file.xyz
    ├── subfolder 3
    │    ├── file.def
    │    ├── file.out
    │    └── subfolder.out
    └── subfolder 4

요약하자면, 하위 폴더에 특정 확장자를 가진 파일이 있는지 테스트하고 해당 파일이 포함된 폴더 내에서 명령을 실행하고 결과 출력이 해당 파일이 생성된 폴더 내에 모두 있도록 하려고 합니다. 특정 확장자를 가진 폴더에서 찾은 모든 파일뿐만 아니라 와일드카드에서도 명령을 실행하고 싶습니다 *.(abc|def|ghi). command3을 실행하고 싶습니다.모두확장자를 가진 개별 파일을 찾는 것이 아니라 확장자를 가진 파일을 찾습니다.

나는 기본적으로 원한다 cd 올바른 확장자를 가진 파일이 포함된 폴더로 이동하여 command3 * > subfolder.out . 문서 subfolder.out 올바른 하위 폴더에 생성하고 보관해야 합니다.

어떻게 해야 하나요? 미리 감사드립니다.

답변1

다음과 같은 옵션을 find사용하여 명령을 시도해 보세요 .-execdir

find <directory> -type f -name "*.<extension>" -execdir <command> {} \;

find명령은 다음을 검색합니다.목차확장자(*)가 있는 모든 파일의 경우확장하다그것은 실행될 것이다주문하다{}파일( )이 위치한 디렉토리 .

다른 예시:

find /home/mike/ -type f -name "*.java" -execdir pwd \;

위 명령은 디렉토리에서 모든 Java 파일을 찾고 발견된 파일의 현재 작업 디렉토리( )를 /home/mike/인쇄합니다 . pwd현재 파일에서 명령을 실행해야 하는 경우 {}첫 번째 예에 표시된 명령을 사용하십시오.

따라서 기본적으로 이는 귀하의 사용 사례에 적합해야 합니다.

$ tree
.
├── subfolder1
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   └── test.def
└── subfolder3
    └── test.xyz

그런 다음 찾기를 실행합니다.

find /home/mike/ -type f \( -name "*.abc" -o -name "*.def" -o -name "*.ghi" \) -execdir sh -c "command3 '{}' > subfolder.out" \;

그 결과는 다음과 같습니다.

tree
.
├── subfolder1
│   ├── subfolder.out
│   ├── test2.abc
│   ├── test2.efgs
│   └── test.abc
├── subfolder2
│   ├── subfolder.out
│   └── test.def
└── subfolder3
    └── test.xyz

관련 정보