bash 또는 zsh에서 하나의 파일 확장자 또는 다른 파일 확장자를 반복합니다.

bash 또는 zsh에서 하나의 파일 확장자 또는 다른 파일 확장자를 반복합니다.

이는 구문상 정확합니다.

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 extglobzsh그리고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또는 foottbefore footx및 after foobw).

관련 정보