
일치 항목이 겹치는 경우 중괄호 확장으로 인해 파일 이름의 여러 인스턴스가 생성될 수 있습니다.
간단한 예:
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]*
. 하지만 더 복잡한 경우에는 bash
ksh와 같은 확장된 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