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