이는 구문상 정확합니다.
for f in *bw;do echo $f;done
하지만 그 중 하나를 반복하려면 어떻게 확장을 추가할 수 있나요?
- 다음은 작동하지 않습니다:
for f in *bw|*txt;do echo $f;done
- 이것도 작동하지 않습니다.
for f in *bw or *txt;do echo $f;done
답변1
넌 몰라. 당신은 다시 반복둘 다"확장"하고 (필요한 경우) 둘 중 하나 또는 둘 다 존재하는지 확인하십시오. 예를 들어, 하나만 인쇄하려는 경우(첫 번째 항목) 각 파일의 기본 이름(확장자 없음) 목록을 유지하세요. 연관 배열은 조회하기 쉽기 때문에 유용합니다. 예를 들어 Bash에서는 다음과 같습니다.
declare -A files
for f in *.bw *.txt; do
bn=${f%.*}
if [ -z "${files[$bn]}" ] ; then
echo "$f"
files["$bn"]=1
fi
done
답변2
큰 타격을 입은 상태에서및 shopt -s extglob
zsh그리고KSH_GLOB
할 수 있게 하다:
for f in *.@(bw|txt)
Bash에서 일치하는 항목이 없으면 루프가 실행되고 $f
리터럴 string 으로 설정됩니다 *.@(bw|txt)
. 이를 방지하려면 bash에서 다음을 수행하세요.
shopt -s nullglob
for f in *.@(bw|txt)
zsh에서는 기본적으로 일치하는 항목이 없으면 오류 메시지가 표시됩니다. 이를 방지하려면 다음을 추가하세요.N
글로벌 예선.
for f in *.@(bw|txt)(N)
zsh에서, 기본 옵션을 사용 (N)
하고 일치하는 항목이 없으면 아무 작업도 수행하지 않는 더 간단한 솔루션이 있습니다.
for f in *.(bw|txt)(N)
이 모든 작업은 모든 항목을 알파벳순으로 정렬하며 두 확장자가 혼합된 파일입니다(즉, 확장자만 다른 중복 이름은 (아마도) 연속적입니다). 파이프로 구분된 패턴 항목을 원하는 만큼 괄호 안에 나열할 수 있으며 더 많은 와일드카드를 포함할 수 있습니다(예: (zip|tar.?z)
).
1 foo.bw
foot.bw
foot.txt
foo.txt
그러나 정렬은 로케일에서 순서대로 수행되며, .
오늘날 일반적인 정렬 알고리즘에서는 first가 무시됩니다(like footb
또는 foott
before footx
및 after foobw
).