Bash 스크립트는 모든 하위 디렉터리를 반복하고 스크립트 디렉터리가 존재하는지 확인한 다음 거기에서 스크립트를 실행합니다.

Bash 스크립트는 모든 하위 디렉터리를 반복하고 스크립트 디렉터리가 존재하는지 확인한 다음 거기에서 스크립트를 실행합니다.

저는 bash 스크립팅을 처음 접했고 루프를 사용하여 for시작하는 디렉터리에서 모든 폴더를 찾은 다음 명령문을 사용하여 if이름이 지정된 다른 폴더를 찾는 스크립트를 만들려고 합니다 templates. 그런 다음 실행하고 싶습니다. 해당 폴더에 저장된 Python 스크립트를 실행하는 python 명령입니다.

  • 내 디렉터리 구조는 다음과 같습니다.
    all/
        this_script.sh
        one/
            templates/
                      render_j2.py
        two/
            templates/
                      render_j2.py
    
  • 내가 시도한 this_script-sh것은
    for file in *; do
      if [[ "$file"==*"templates"* ]];
      then
        cd $file
      fi
    done
    
    또한 이것을 시도했습니다:
    for file in *; do
    find . templates
    python render_j2.py; 
    done
    

내 주요 문제는 폴더에 들어갈 수 없고 templates, 들어갈 수 있더라도 python 명령이 실행할 Python 파일을 찾을 수 없다는 것입니다.

답변1

이미 find를 사용하고 있으니 전체 작업을 find로 오프로드하는 것은 어떨까요? 다음을 시도해 볼 수 있습니다.

find . -type f -path "*/templates/render_j2.py" -execdir python render_j2.py \;

render_j2.py그러면 시작점 아래 디렉터리의 모든 파일을 검색 하고 파일이 있는 디렉터리에서 python 명령을 실행합니다.templates

답변2

여기에는 많은 문제가 있습니다.

  • 두 버전 모두 $file디렉토리인지 여부를 테스트하지 않습니다.
  • 첫 번째 버전을 사용하면 디렉토리를 변경 하고 해당 디렉토리에서 수행하려는 작업으로 cd $file인해 $file이 다음 루프 반복에서 유효한 경로가 되지 않습니다 .cd
  • 두 번째 버전에서는 원하는 작업을 수행하지 못하게 하는 구문 오류를 찾아보세요.
  • 이와 같은 루프에서 find를 실행하는 것은 의미가 없습니다. find는 내부적으로 자체 루프를 실행합니다.

다음과 같이 작동할 수 있습니다.

find . -name templates -type d -execdir python {}/render_j2.py \;

이는 다음과 같습니다.

(cd all/one && python ./templates/render_j2.py )
(cd all/two && python ./templates/render_j2.py )
...

이는 여전히 정확히 원하는 것이 아닐 수도 있습니다.

답변3

이것은 일종의 답이 아니지만 지나치게 복잡한 설정처럼 보입니다. 루프를 해야 하거나 단지 배우고 싶은(아마도) 이유가 명시되지 않은 경우 이것이 답이 될 수는 없지만... find 명령을 사용하여 루프 없는 작업을 수행할 수 있습니다.

그것은 마치

find $HOME/my/folders -type d -name templates -exec my.py {} \;

관련 정보