Normalmente, o globing do bash faz distinção entre maiúsculas e minúsculas:
$ 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
O uso de colchetes não parece mudar isso:
$ 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
Ele ainda não o altera se um hífen for usado:
$ 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
Mas as letras são intercaladas:
$ 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
Isso sugere que o hífen está usando uma ordem de localidade "AaBbCcDd". Então: existe alguma maneira de enviar glob para todos os arquivos que começam com uma letra maiúscula?
[A-Z]
combina letras minúsculas no bash?Respostas:
Na versão 4.3 e posterior do bash, existe uma opção shopt chamada
globasciiranges
:De acordo com as páginas de manual do shopt builtin gnu :
Como resultado, você pode
Use
shopt -u
para desativar.Outra maneira é mudar o código de idioma para C. Você pode fazer isso temporariamente usando um subshell:
Você obterá os resultados necessários e, quando o sub shell for concluído, o código do idioma do shell principal permanecerá inalterado em relação ao que havia antes.
Outra alternativa é, em vez de
[A-Z]
usar a expansão de chaves,{A..Z}
juntamente com anullglob
opção bash shopt.Ao ativar a
nullglob
opção, se um padrão não for correspondido durante a expansão do nome do caminho, uma cadeia nula será retornada em vez do próprio padrão.Como resultado, este funcionará conforme o esperado:
fonte
[[:upper:]]
porque, na verdade, quero apenas parte do alfabeto, mas isso funciona.man bash
no seu terminal e procurar (usando/
) por globasciiranges.LC_ALL=C printf '%s\n' [A-Z]*
funcionaria para sua segunda solução - sem um subshell? BTW: há um erro de digitação:,nullblog
mas são poucos caracteres para eu corrigi-lo.Você pode escrever todas as letras maiúsculas exatamente como:
ou use pode usar a classe de caracteres nomeada
[:upper:]
para representar todas as letras maiúsculas no seu atuallocale
:Como você notou, ao usar o intervalo, como
[B-C]
as letras maiúsculas e minúsculas para o mesmo caractere alfabético, estão sendo organizadas adjacentemente (de acordo com a ordem de intercalação dolocale
).fonte
A inclusão de caracteres “não intuitivos” nos intervalos de caracteres, como a inclusão de letras minúsculas em um intervalo cujos limites sejam letras maiúsculas, deve-se à
LC_COLLATE
configuração de localidade.LC_COLLATE
deve indicar a ordem de classificação, mas faz um mau trabalho (as strings de classificação são mais complexas do que as localidades podem fazer) e você fica melhor sem ela. Eu recomendo removerLC_COLLATE
das configurações de localidade. Se você estiver configurandoLANG
, ouLANGUAGE
, não faça isso e definir apenas o que você precisa:LC_CTYPE
,LC_MESSAGES
,LC_TIME
.Para obter mais informações sobre localidades, consulte Para o que devo definir minha localidade e quais são as implicações disso? e defina LC_ *, mas não LC_ALL
Para obter resultados confiáveis em um script, independentemente das configurações do usuário, defina
LC_ALL=C
.fonte
Conjunto:
Na página do manual do bash:
Se você definir 'globasciiranges', não sei o que acontecerá com caracteres não-ascii como utf-8.
fonte
eco [cC] * deve fazer o que você deseja, da mesma forma [A-Za-z] *
Estou aqui porque o globbing no meu sistema acabou de deixar de ser sensível a maiúsculas e minúsculas; portanto, muitos dos meus scripts não funcionam mais como deveriam :-(
fonte