No Bash, as expansões de curingas estão garantidas?

54

A expansão de um curinga no Bash está garantida em ordem alfabética? Sou forçado a dividir um arquivo grande em pedaços de 10 Mb para que eles possam ser aceitos pelo meu repositório do Mercurial.

Então, eu estava pensando em usar:

split -b 10485760 Big.file BigFilePiece.

e depois no lugar de:

cat BigFile | bigFileProcessor

Eu poderia fazer:

cat BigFilePiece.* | bigFileProcessor

em seu lugar.

No entanto, não consegui encontrar em nenhum lugar que garantisse que a expansão do asterisco (aka curinga, aka *) sempre estivesse em ordem alfabética, de modo que .aavinha antes .ab(em oposição a pedidos de carimbo de data / hora ou algo assim).

Além disso, existem falhas no meu plano? Qual é o custo de desempenho catdo arquivo juntos?

Trenó
fonte
4
Com certeza você está adotando a abordagem errada. Se o administrador colocou um limite para o tamanho dos arquivos que você possui no repositório, você deve conversar com ele. Falando sobre expansão - sempre vi que a expansão é alfanumérica.
Mircea Vutcovici 15/03
11
Você sempre pode canalizar sortse precisar de alguma manipulação de pedido adicional.
21410 Warner
2
Observe que o Mercurial pode gerenciar arquivos de qualquer tamanho, limitados pela quantidade de RAM que você possui. Você recebe um aviso se adicionar um arquivo grande, pois o Mercurial assume que ele pode reter o arquivo na memória. Para mesclagens, o Mercurial precisa manter dois arquivos na memória. Máquinas com pequenas quantidades de RAM podem, portanto, ter problemas ao verificar o arquivo. Acabei de testar e, hg commitem um Narquivo MB, são necessários cerca de 3 * NMB de RAM e hg updatecerca de 2 * NMB de RAM. Isso ocorre com o Mercurial 1.5 no Linux.
Martin Geisler

Respostas:

67

Sim, a expansão globbing é alfabética.

Na manpágina do Bash :

Expansão do nome do caminho

Depois de repartição de palavras, a menos que a -fopção tiver sido definido, o bash verifica cada palavra para os personagens *, ?e [. Se um desses caracteres aparecer, a palavra será considerada um padrão e substituída por uma lista classificada alfabeticamente de nomes de arquivos que correspondem ao padrão.

Dennis Williamson
fonte
@ Dennis Williamson, Alguma idéia se isso ainda seria verdade se um usuário tiver um idioma diferente definido?
precisa
5
@Zoredache: Na verdade, é especificado pelo POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "Os nomes de caminho estão na ordem de classificação, conforme definido pela configuração atual da categoria LC_COLLATE, consulte a especificação XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "e é por isso que você deve fazer coisas como em ls -l [[:lower:]]vez de ls -l [a-z].
Dennis Williamson
Note-se que a ordem é alfabética tão BigFilePiece.10 virá antes BigFilePiece.2
Ken
@DennisWilliamson - Por que dois pares de colchetes? Parece-me que funciona exatamente o mesmo para mim.
ArtOfWarfare 14/03/19
2
@ArtOfWarfare: Tente isto: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. O arquivo "z" é listado apenas pelo segundo, lsporque está solicitando nomes de arquivo em letra minúscula. O primeiro ls- aquele sem os colchetes externos - está solicitando nomes de arquivo com um único caractere na lista de caracteres ":", "l", "o", "w", "e" e "r". Nos dois casos, os colchetes mais externos delimitam uma expressão de colchete que lista caracteres e classes. No caso de [[:lower:]], os colchetes internos, dois pontos e a palavra nomeiam uma classe de caractere. ...
Dennis Williamson
4

É um comportamento documentado para bashque você possa confiar nos seus scripts. Isso também acontece com outros shells compatíveis com Bourne há muito tempo ... embora possa haver casos de canto em relação a caracteres não-alfanuméricos ou dobras de maiúsculas e minúsculas.

(A lista resultante bashserá em ordem quase "ASCII-betical" - exceto que as letras maiúsculas e minúsculas serão agrupadas como se não houvesse diferenças entre maiúsculas e minúsculas, mas com letras minúsculas antes dos equivalentes em maiúsculas. -alphabetics deve agrupar na mesma ordem em que aparecem em ASCII).

Como outros salientaram, isso pode ser perturbado pelas configurações do ambiente relacionado ao idioma: LANG geralmente e LC_COLLATE mais especificamente. Pode ser mais seguro executar comandos que dependem de pedidos de expansão global sob um envcomando para limpar o ambiente (usando -iou -uconforme apropriado) ou canalizar os resultados sortpara garantir um seqüenciamento robusto.

Jim Dennis
fonte
4
Parece que todos os não alfanuméricos são ignorados no processo de classificação. Portanto, "=", "_", "~" não pode ser usado para forçar um arquivo a iniciar ou finalizar (respectivamente) a lista.
Otheus
3

Embora as expansões glob sejam classificadas em ordem alfabética, elas também obedecem à configuração do idioma da concha.

Certifique-se de definir isso como "C" em seu script, se você pretende que seja portátil.

adaptr
fonte