둘 사이의 논리적인 차이점은 무엇인가
ll -d !(.*@(ry|rc))
ll -d !(.*{ry,rc})
?
내 홈 디렉토리에서 이를 사용하면 두 번째는 일치 .bash_history
하고 .xinputrc
첫 번째는 일치하지 않습니다.
노트:
$ shopt extglob
extglob on
답변1
ll -d -- !(.*{ry,rc})
와일드카드와 중괄호 확장을 결합합니다. 먼저 이것을 다음과 같이 확장합니다.
ll -d -- !(.*ry) !(.*rc)
구가 개별적으로 확장됩니다. 첫 번째 일치 .inputrc
( bash -O extglob
그러나 ksh
해당 문법의 소스나 시뮬레이션 zsh
에서는 일치하지 않습니다 ksh
. 이는 숨겨진 파일이고 도트 파일은 명시적으로 요청되지 않기 때문입니다).
이러한 glob이 어떤 파일과도 일치하지 않는 디렉터리에서 이를 확인할 수 있습니다(이 경우 glob은 변경되지 않고 유지되며 bash
이는 해결할 수 있는 또 다른 버그 기능입니다 shopt -s failglob
). 예를 들어 읽기 권한이 없는 디렉터리에서 중간에:
$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)
그리고
ll -d -- !(.*@(ry|rc))
그것은 무리입니다.
여기에서 다음 작업도 수행할 수 있습니다.
ll -d -- !(.*r[cy])
또는:
ll -d -- !(.*rc|.*ry)
bash
이 확장에는 및 도 포함되어 있습니다 .
. ..
해당 파일을 제외하고 싶지만(아마 그럴 것이라고 확신합니다) 숨겨진 파일은 계속 포함하려면 다음을 수행해야 합니다.
shopt -s dotglob
ll -d -- !([.]*@(rc|ry))
또는 명시적으로 제외할 수도 있습니다.
ll -d -- !(.*@(rc|ry)|.|..)
에서는 zsh -o extendedglob
다음을 수행합니다.
ll -d -- ^.*(rc|ry)(D)
(이 glob에 대해서만 활성화됩니다 (D)
).dotglob