7개의 파일 세트가 있다고 가정해 보겠습니다.
item1_data
item2_data_more
item3_data
item4_data
item5_data_more
other6_data
other7_data_more
item
로 시작하지만 끝나지 않는 세 개를 일치시키고 싶습니다 more
. 이것이 예시 시나리오라는 점을 감안할 때 단순히 item*data?
긍정적인 일치 패턴(또는 간단한 변형)을 일치시키는 것만으로는 충분하지 않다는 점을 인정해야 합니다.
나는 bash
활성화를 사용하고 있습니다 extglob
. 간단한 경우에는 매뉴얼 페이지의 설명으로 충분합니다("!(pattern‐list)
주어진 패턴 중 하나를 제외한 모든 항목과 일치"). 하지만 여기서는 쌍 일치를 달성해야 item
하지만 부정적인 일치가 필요합니다 data
. 결국 작동하는 일치를 찾았지만 이해가 되지 않는 것은 작동하지만 다른 일치는 실패하는 이유입니다.
shopt -s extglob # Enable extended globbing
touch {item{1,3,4},other6}_data {item{2,5},other7}_data_more # Example data set
ls !(*more) # Non-"item" files too
item1_data item3_data item4_data other6_data
ls item*!(more) # All "item" files
item1_data item2_data_more item3_data item4_data item5_data_more
ls item!(*more) # Works as required
item1_data item3_data item4_data
왜 두 번째는 실패하고 세 번째는 성공했을까요? 나는 와일드카드가 어느 위치에서나 작동해야 한다고 생각했지만 분명히 그렇지 않았습니다. 누군가 나를 깨달을 수 있습니까?
답변1
item*
각 파일의 전체 파일 이름이 일치하고 일반적으로 끝에 있는 빈 문자열이 일치하기 때문에 두 번째 표현식이 실패한다고 말하고 싶습니다 !(more)
.
답변2
나에게 필요한 답은 다음 중 하나에서 찾을 수 있습니다.다른 답변이 문제에 대한Bash에서 여러 예외를 제공하면서 와일드카드 rm 파일을 대상으로 지정하는 방법참고로코멘트내 질문에.
나에게 딱 맞는 문구는 이렇다.
주목해야 할 중요한 점은
!(…)
이미*
, 그 자체가 내부 항목 중 하나가 아닌 항목과 일치하기 때문입니다.
나는 그것이 *
내 이해의 장벽이 되는 것과 동일하다고 생각하지 않습니다.