여러 디렉터리에서 bash 스크립트를 실행하는 방법은 무엇입니까?

여러 디렉터리에서 bash 스크립트를 실행하는 방법은 무엇입니까?

conv.sh현재 디렉토리의 MP3 파일을 반복하여 OGG로 변환하는 스크립트가 있습니다 . 또한 {F1, F2,..., F20}이 있는 여러 디렉터리가 있습니다 . 이 모든 디렉터리에서 /path/to/Files/어떻게 실행해야 합니까 ?conv.sh

답변1

이 시도

curdir=$(pwd)
for folder in /path/to/Files/*; do 
  [ -d "$folder" ] && cd "$folder" && ./conv.sh
done
cd $curdir

또는 당신이 그렇다고 가정하면 /path/to/Files/이것도 작동합니다

for f in *; do [ -d "$f" ] && cd "$f" && ./conv.sh; done; cd ..

F{1..20}더 나은 정확도를 얻으 려면 대체를 사용할 수 있습니다 *.

답변2

이 시도:

./conv.sh /path/to/Files/F[0-9]*/*.mp3

이 명령은 F및 숫자로 시작하는 디렉토리의 mp3 만 처리합니다.구체

답변3

xargs 또는 GNU 병렬 처리를 사용할 수 있습니다.

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  xargs -L conv.sh

또는:

echo /path/to/Files/F{1..20} | tr ' ' '\n' |
  parallel conv.sh

편집 - 공간을 현명하게 처리

Ole이 지적했듯이 위의 방법 중 어느 것도 공백을 올바르게 처리하지 않습니다. 즉, dir name두 개의 별도 인수로 처리되며 디렉터리 이름에 개행 문자가 포함된 경우 동일한 문제가 발생합니다.

이러한 문제를 해결하는 가장 좋은 방법은 예를 들어 GNU find를 사용하여 null을 구분 기호로 사용하는 것입니다.

find /path/to/Files -mindepth 1 -maxdepth 1 -type d -regex '.*/F[0-9]*' -print0 |
  parallel -0 conv.sh

관련 정보