이 두 명령을 사용하면 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
오류 를 예측할 수 없습니다(다른 사항에 따라 다름).ls
fakedir/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
설정하는 것이 좋습니다. 강력하지는 않지만 중괄호 확장보다 더 좋습니다.extglob
zsh
zsh
특히 (foo|bar)
s in 에 해당하는 것은 bash -O extglob
is입니다 @(foo|bar)
(이 구문은 ksh에서 유래함).