중복된 Bash 중괄호 확장 제거

중복된 Bash 중괄호 확장 제거

일치 항목이 겹치는 경우 중괄호 확장으로 인해 파일 이름의 여러 인스턴스가 생성될 수 있습니다.

간단한 예:

mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*

이는 설명 목적으로만 사용된 매우 간단한 예입니다. 이 경우 단일 파일이 abcd두 번 처리(또는 나열)됩니다.

이 목록을 중복 제거하는 가장 좋은 방법은 무엇입니까?

  • 연관 배열을 사용할 수 있습니다.
  • 정교한 glob/brace 확장을 사용할 수 있지만 이는 강력하지 않습니다.

답변1

예,

for f in *{b,c}*

먼저 다음으로 확장하세요.

for f in *b* *c*

그런 다음 이 두 glob의 독립적인 확장을 통해 반복됩니다.

당신이 원하는 것은 덩어리입니다. 그렇습니다 *[bc]*. 하지만 더 복잡한 경우에는 bashksh와 같은 확장된 glob을 활성화해야 합니다. nullglob 옵션을 원할 수도 있습니다:

shopt -s nullglob extglob
for f in *@(b|c)*; do...

존재하다 zsh:

for f in *(b|c)*(N); do

(N)각 글로브의 존재 nullglob.

존재하다 ksh93:

for f in ~(N)*@(b|c)*; do

관련 정보