bash extglob을 사용하여 네거티브 패턴 일치

bash extglob을 사용하여 네거티브 패턴 일치

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 파일을 대상으로 지정하는 방법참고로코멘트내 질문에.

나에게 딱 맞는 문구는 이렇다.

주목해야 할 중요한 점은 !(…)이미*, 그 자체가 내부 항목 중 하나가 아닌 항목과 일치하기 때문입니다.

나는 그것이 *내 이해의 장벽이 되는 것과 동일하다고 생각하지 않습니다.

관련 정보