일반적으로 bash 와일드카드는 대소문자를 구분합니다.
$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips
대괄호를 사용해도 변경되지 않는 것 같습니다.
$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips
하이픈을 사용해도 여전히 변경되지 않습니다.
$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips
그러나 편지는 흩어져 있습니다.
$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
이는 하이픈이 "AaBbCcDd" 로케일 순서를 사용하고 있음을 나타냅니다. 그렇다면 대문자로 시작하는 모든 파일을 와일드카드로 지정할 수 있는 방법이 있습니까?
답변1
Bash 4.3 이상에는 다음과 같은 shopt 옵션이 있습니다 globasciiranges
.
~에 따르면shopt 내장 GNU 매뉴얼 페이지:
globasciiranges
설정된 경우 패턴 일치 대괄호 식(패턴 일치 참조)에 사용되는 범위 식은 비교를 수행할 때 기존 C 로캘에서처럼 작동합니다. 즉, 현재 로케일의 조합 순서를 고려하지 않으므로 'A'와 'B' 사이에서 'b'는 대조되지 않지만 ASCII 대문자와 소문자는 함께 대조됩니다.
당신이 할 수 있다는 것이 밝혀졌습니다
$ shopt -s globasciiranges
$ echo [A-Z]*
비활성화 합니다 shopt -u
.
또 다른 방법은 로케일을 C로 변경하는 것입니다. 서브셸을 사용하여 임시로 이 작업을 수행할 수 있습니다.
$ ( LC_ALL=C ; printf '%s\n' [A-Z]*; )
원하는 결과를 얻을 수 있으며, 서브쉘이 완료되면 메인 쉘의 로케일은 이전과 동일하게 유지됩니다.
또 다른 옵션은 bash shopt 옵션과 함께 중괄호 확장을 사용하지 않는 것입니다 [A-Z]
.{A..Z}
nullglob
이 옵션을 활성화하면 nullglob
경로 이름 확장 중에 패턴이 일치하지 않는 경우 패턴 자체 대신 빈 문자열이 반환됩니다.
결과적으로 예상대로 작동합니다.
$ shopt -s nullglob;printf '%s\n' {A..Z}*
답변2
다음과 같이 모두 대문자를 쓸 수 있습니다.
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
또는 명명된 문자 클래스를 사용하여 [:upper:]
현재의 모든 대문자를 나타낼 수 있습니다 locale
.
[[:upper:]]*
알다시피, 범위(예: [B-C]
동일한 알파벳 문자의 대문자 및 소문자)를 사용하면 서로 나란히 정렬됩니다( 의 조합 규칙에 따라 locale
).
답변3
문자 범위에 "직관적이지 않은" 문자(예: 대문자로 묶인 범위의 소문자)를 포함하는 것은 LC_COLLATE
로케일 설정 때문입니다. LC_COLLATE
는 정렬 순서를 나타내야 하지만 제대로 작동하지 않으며(문자열 정렬은 로캘에서 수행할 수 있는 것보다 더 복잡함) 이를 사용하지 않는 것이 더 나을 것입니다. LC_COLLATE
귀하의 로케일에서 제거하는 것이 좋습니다 . LANG
, 또는 을 설정하려면 LANGUAGE
이렇게 하지 말고 필요한 것만 설정하세요: LC_CTYPE
, LC_MESSAGES
, LC_TIME
.
로캘 설정에 대한 자세한 배경 정보는 다음을 참조하세요.로케일을 무엇으로 설정해야 하나요? 이것이 어떤 영향을 미칠까요?그리고LC_*를 설정하지만 LC_ALL은 설정하지 않음
사용자의 설정에 관계없이 스크립트에서 신뢰할 수 있는 결과를 얻으려면 를 설정하십시오 LC_ALL=C
.
답변4
echo [cC]*는 [A-Za-z]*와 같이 원하는 작업을 수행해야 합니다.
내 시스템의 와일드카드가중지됨대소문자를 구분하므로 많은 스크립트가 더 이상 제대로 작동하지 않습니다. :-(