확장된 glob을 사용하려고 하는데 bash -c
작동하게 하는 방법을 찾지 못했습니다.
내가 시도한 것들
bash -c 'for f in *.!(ext); do echo $f; done'
결과:
bash: -c: line 0: syntax error near unexpected token `('
bash -c 'for f in *.!\(ext\); do echo $f; done'
결과:
*.!(ext)
bash -c 'for f in *.!$0; do echo $f; done' '(ext)'
결과:
*.!(ext)
bash -c 'for f in "*.!(ext)"; do echo $f; done'
결과:
*.!(ext)
답변1
에서 확장된 글로빙 모드를 사용하려면 어떤 방식으로든 셸 옵션을 활성화 bash
해야 합니다 .extglob
인라인 스크립트에 대해 이 작업을 수행하는 가장 쉬운 방법은 bash -c
명령줄에서 옵션을 사용하여 셸 옵션을 설정하는 것입니다.-O
bash -O extglob -c 'script code here'
직접 전화하셔도 됩니다shopt -s extglob
스크립트 내에서, 그러나 쉘이 코드를 구문 분석하는 방식을 변경하므로(쉘의 구문을 수정함) 이 작업이 별도의 줄에서 수행되는지 확인해야 합니다.
bash -c 'shopt -s extglob
script code here'
문자열로 끝나지 않는 모든 이름을 인쇄하는 실제 작업은 다음과 같습니다 .ext
.
bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'
추가 설정 dotglob
및 nullglob
옵션을 사용하면 스크립트는 숨겨진 이름을 일치시키고 일치하는 항목이 없으면 (확장되지 않은 패턴을 인쇄하는 대신) 빈 줄을 인쇄합니다.
패턴은 (not just)로 *.!(ext)
끝나는 파일 이름을 제외합니다.ext
.ext
그리고점이 포함되지 않은 파일 이름입니다.