저는 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 {} \;