`zsh`의 그룹 디렉토리

`zsh`의 그룹 디렉토리

이 두 명령을 사용하면 zsh동일한 결과가 생성됩니다.

ls (dir1|dir2)/dir3/*.txt
ls {dir1,dir2}/dir3/*.txt

bash다음 작품 만 사용하세요 .

ls {dir1,dir2}/dir3/*.txt

.txt따라서 여러 특정 디렉터리의 모든 파일을 나열하려면 zsh위 옵션 중 하나를 사용하는 것이 바람직합니까 아니면 올바른가요? 아니면 동일하며 zsh에 누락된 정규식 기능만 제공합니까 bash?

답변1

아마도 첫 번째 버전을 선택해야 할 것입니다.

(...)생성하도록 설계된 글로벌 운영자입니다.파일 이름, 버팀대 확장이라고 하는 동안 은 {...}다음을 생성하도록 설계되었습니다.. 대부분의 경우 파일 이름이 문자열이므로 둘 사이를 전환하여 동일한 결과를 얻을 수 있지만 차이는 거의 없습니다. 예를 들어, 존재하지 않는 디렉토리를 생각해 보십시오. 이 경우 다음과 같은 결과를 얻게 됩니다.

$ ls (dir1|fakedir)/dir3/*.txt
dir1/dir3/file.txt

$ ls {dir1,fakedir}/dir3/*.txt
zsh: no matches found: fakedir/dir3/*.txt

어쩌면 첫 번째 결과를 원할 수도 있습니다. 중요한 것은 두 번째 경우의 오류는 중괄호 확장에서 발생하는 것이 아니라 *! 삭제하면 액세스할 수 없다고 주장하므로 ls (dir1|dir1)/dir3오류 를 예측할 수 없습니다(다른 사항에 따라 다름).lsfakedir/dir3

또 다른 차이점은 첫 번째 버전은 디렉터리가 중복되는 경우 하나의 출력만 생성하는 반면 두 번째 버전은 동일한 출력을 여러 번 생성한다는 것입니다.

$ ls (dir1|dir1)/dir3/*.txt
dir1/dir3/file.txt

$ ls {dir1,dir1}/dir3/*.txt
dir1/dir3/file.txt  dir1/dir3/file.txt

다시 말하지만, 대부분의 경우 사용자는 첫 번째 결과를 원한다고 생각합니다.

글로빙 메커니즘을 완벽하게 제어하려면 다음 내용을 숙지하는 것이 좋습니다.글로벌 예선(바라보다 man zshexpn).


그렇다면 더 많은 전역 변수에 액세스할 수 있는 옵션을 bash설정하는 것이 좋습니다. 강력하지는 않지만 중괄호 확장보다 더 좋습니다.extglobzsh

zsh특히 (foo|bar)s in 에 해당하는 것은 bash -O extglobis입니다 @(foo|bar)(이 구문은 ksh에서 유래함).

관련 정보