for 루프 글로브 사고

for 루프 글로브 사고

디렉터리 집합을 반복하면서 .jpg 파일이 발견되면 한 작업을 수행하고 .nef 파일이 발견되면 다른 작업을 수행하는 스크립트를 설정하려고 합니다. 문제는 디렉토리에 .jpg 파일(또는 .nef)이 없으면 glob 항목이 더 이상 확장된 glob이 아니라 단지 문자열이라는 것입니다. 예를 들어:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

my_dir 폴더에 .JPG 파일이 있으면 명령줄에 올바르게 표시됩니다.

pictures/one.JPG
pictures/two.JPG

그러나 my_dir에 .JPG 파일이 없으면 루프는 한 번의 반복을 입력하고 에코됩니다.

pictures/*.JPG

glob에 일치하는 항목이 없으면 for 루프에 들어가지 않도록 이를 어떻게 구성합니까?

답변1

이는 일반적인 기본 동작입니다. 와일드카드가 파일/디렉토리와 일치할 수 없는 경우 원래 와일드카드가 유지됩니다.

빈 결과를 반환하려면 nullglob다음과 같이 스크립트에서 이 옵션을 설정할 수 있습니다.

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

나중에 다음을 통해 비활성화할 수 있습니다.

$ shopt -u nullglob

답변2

조금 옆으로 가보면, find파일에 대해 실행하는 명령이 한 줄에 들어갈 만큼 간단하다면 여기에서도 를 사용하는 것이 유용할 수 있습니다. 찾기는 찾기 위해 여러 경로를 사용할 수 있으며 하위 디렉터리에 있는 모든 파일을 찾는 것도 좋습니다.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(실행할 명령은 플래그 뒤에 주어지며 -exec.로 끝나며 현재 파일 이름으로 대체됩니다.);{}

답변3

스크립트 시작 부분에 이 줄을 추가하세요.

shopt -s nullglob

관련 정보