디렉터리 집합을 반복하면서 .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