bash에서는 종종 다음과 같은 for 루프를 사용합니다.
for file in *.type; do
sommecommand "$file";
done;
일치하는 모든 파일에 대해 작업을 수행합니다 *.type
. 이 끝이있는 파일이 작업 디렉토리에 없으면 별표가 확장되지 않으며 일반적으로 somecommand가 파일을 찾지 못했다는 오류 메시지가 표시됩니다. 이 오류를 피하는 여러 가지 방법을 즉시 생각할 수 있습니다. 그러나 조건부 추가는 매우 우아하지 않은 것 같습니다. 이를 달성하기위한 짧고 깨끗한 방법이 있습니까?
답변
예, 다음 명령을 실행하십시오.
shopt -s nullglob
일치를 무효화하고 오류가 발생하지 않습니다.
- 이 동작을 기본적으로 원한다면
~/.bashrc
-
POSIX 셸에서 null glob을 감지하려면 시도하십시오.
for i in *.txt; do [ "$i" = '*.txt' ] && [ ! -e '*.txt' ] && continue done
답변
bash에서는 shopt -s nullglob
일치하는 항목이 없으면 빈 배열로 확장하는 데 사용할 수 있습니다 .
이없는 POSIX 셸에서는 루프 의 첫 번째 부분으로 사용하여 nullglob
전달되는 파일 이름이 실제로 존재하는지 확인하여이 문제를 피할 수 있습니다 .[ -e "$file" ] || [ -L "$file" ] || continue
for
답변
nullglob
옵션이 없는 쉘의 일반적인 기술 은 다음과 같습니다.
set -- [*].type *.type
case $1$2 in
'[*].type*.type') shift 2;;
*) shift
esac
for file do
cmd -- "$file"
done
추가 사항 [*].type
은 *.type
현재 디렉토리에 하나의 파일이있는 경우를 다루는 것 입니다.
이제 도트 파일을 포함하려면 더 복잡해집니다 .
나는 몇 년 전에 기술이 유즈넷에서 Laura Fairhead에 의해 만들어 졌다고 믿습니다.
답변
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
이것은 for
방정식에서 루프와 쉘의 globbing을 완전히 제거합니다 . find
실행합니다-exec
일치 할 때마다 명령을 한 번 일치하는 항목이 없으면 실행되지 않습니다. -maxdepth 0
에 지시는 (지정된 경로 인수의 하위 디렉토리로 재귀하지 않는 발견 .
이 경우).
단점은 다른 모든 응용 프로그램과 관련이 있지만 실제로는 거의 모든 Linux 시스템 (및 아마도 대부분의 Unix)에도 존재하는 응용 프로그램입니다.