일반적으로 bash globbing은 대소 문자를 구분합니다.
$ 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”를 사용하고 있음을 나타냅니다. 대문자로 시작하는 모든 파일을 가져갈 수있는 방법이 있습니까?
답변
bash 버전 4.3 이상에는 다음과 같은 shopt 옵션이 있습니다 globasciiranges
.
shopt 내장 gnu 매뉴얼 페이지 에 따르면 :
globasciiranges
설정되면, 패턴 일치 괄호 표현식 (패턴 일치 참조)에 사용 된 범위 표현식은 비교를 수행 할 때 기존 C 로케일 에서처럼 작동합니다. 즉, 현재 로케일의 조합 순서는 고려되지 않으므로 ‘b’는 ‘A’와 ‘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}*
답변
다음과 같이 대문자를 모두 쓸 수 있습니다.
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
또는 명명 된 문자 클래스 [:upper:]
를 사용 하여 현재의 모든 대문자를 나타낼 수 있습니다 locale
.
[[:upper:]]*
아시다시피 [B-C]
, 대문자와 소문자와 같은 범위를 사용하는 동안 동일한 알파벳 문자가 인접하여 정렬됩니다 (의 데이터 정렬 순서에 따라 locale
).
답변
경계가 대문자 인 범위에 소문자를 포함하는 것과 같이 문자 범위에 “직관적이지 않은”문자를 포함시키는 것은 LC_COLLATE
로케일 설정 때문입니다. LC_COLLATE
정렬 순서를 나타내야하지만 정렬 순서가 좋지 않습니다 (로컬을 정렬하는 것이 로케일보다 더 복잡합니다). LC_COLLATE
로케일 설정에서 제거 하는 것이 좋습니다 . 있는 거 설정이있는 경우 LANG
, 또는 LANGUAGE
, 당신이 필요로 그렇게 만 사람 설정하지 : LC_CTYPE
, LC_MESSAGES
, LC_TIME
.
로케일에 대한 자세한 내용은 로케일을 어떻게 설정해야하며 그 의미는 무엇입니까?를 참조하십시오. 및 세트 LC_ *하지만 LC_ALL
사용자 설정에 관계없이 스크립트에서 안정적인 결과를 얻으려면을 설정하십시오 LC_ALL=C
.
답변
세트:
shopt -u nocaseglob
bash 맨 페이지에서 :
> nocaseglob
> If set, bash matches filenames in a case-insensitive
> fashion when performing pathname expansion (see Pathname
> Expansion above).
‘globasciiranges’를 설정하면 utf-8과 같은 ASCII가 아닌 문자에 어떤 일이 발생하는지 알 수 없습니다.
답변
echo [cC] *도 마찬가지로 원하는대로해야합니다. [A-Za-z] *
나는 시스템에서 globbing 이 대소 문자를 구분 하지 않기 때문에 여기에 왔기 때문에 많은 스크립트가 더 이상 작동하지 않습니다.