디렉터리를 찾기에서 파일 위치로 변경하고 두 계층 위의 스크립트를 실행합니다(마치 동일한 디렉터리에 있는 것처럼) - bash

디렉터리를 찾기에서 파일 위치로 변경하고 두 계층 위의 스크립트를 실행합니다(마치 동일한 디렉터리에 있는 것처럼) - bash

질문:

안녕하세요, 여러 디렉터리(예: /path/to/*.faa)에 있는 각 *.faa 파일을 반복하려고 합니다.

그런 다음 스크립트가 *.faa 파일과 동일한 디렉토리에 있는 것처럼 스크립트(./script.py)를 사용하십시오. 쉘스크립트로 이것이 가능합니까?

내가 시도한 것:

for FAA in $(find . -name "*.faa")
do
    cd ../$FAA
    python3 ../script.py
done

이에 대한 변형을 시도했지만 디렉터리를 파일로 변경해도 작동하지 않지만 디렉터리에 액세스하는 방법을 모르겠습니다.

원하는 출력:

/path/to/1.faa, path/2/2.faa와 같은 여러 디렉터리에 있는 각 .faa 파일에 대해 위의 두 수준에서 스크립트를 실행합니다. 모든 *.faa 파일과 동일한 디렉토리에 있는 것과 같습니다. 또는 이것이 가능하지 않은 경우 비슷한 것을 달성하는 가장 좋은 솔루션은 무엇입니까?

답변1

find . -type f -name '*.faa' -execdir python3 ../script.py ';'

이는 python3 ../script.py다음 디렉터리에서 실행됩니다.작업 디렉토리로 파일을 찾으십시오.

../script.py귀하의 텍스트와 코드가 다소 충돌하기 때문에 또는 이어야 하는지 잘 모르겠습니다 ../../script.py.

script.py또한 이는 지정된 디렉터리에서 파일을 실제로 사용할 수 있는 경우에만 작동한다는 점에 유의하세요. 스크립트 파일의 절대 경로를 제공하는 것이 더 안전할 수 있습니다.

find . -type f -name '*.faa' -execdir python3 /path/to/script.py ';'

.faa위 코드는 디렉터리에 여러 파일이 있더라도 발견된 모든 파일에 대해 스크립트를 실행합니다. 하나 이상의 파일이 포함된 각 디렉터리에 대해 한 번만 스크립트를 실행하려면 다음을 수행합니다 .faa.

find . -type d -exec sh -c '
    for dir do
        set -- "$dir"/*.faa
        if [ "$#" -gt 0 ]; then
            ( cd "$dir" && python3 /path/to/script.py )
        fi
    done' sh {} +

그러면 발견된 각 디렉토리에 대해 짧은 쉘 스크립트가 실행됩니다. 스크립트는 디렉터리에 .faa파일이 있는지 확인합니다. 존재하는 경우 이 디렉터리를 작업 디렉터리로 사용하여 Python 스크립트를 실행합니다.

관련된:

관련 정보