Eu criei três arquivos no meu diretório usando o comando touch inv{1..3}.txt
. Agora eu usei dois comandos e sua saída é praticamente a mesma. Esses dois comandos são ls inv[13].txt
e ls {1,3}.txt
.
Então, como esses dois são diferentes? Como os colchetes são diferentes em comparação com os colchetes? Também estava pesquisando no "linux [..]", mas não consegui encontrar nada, então eu poderia saber como essas coisas são chamadas na terminologia do linux?
obrigado
command-line
bash
scripts
posixKing
fonte
fonte
{}
e Expansão de nome de arquivo> Correspondência de padrões para[]
.Respostas:
{}
é chamado de expansão de chave. Ele tem duas formas:{x..y}
e{x,y}
, substituax
ey
por qualquer valor alfabético ou numérico.Na primeira forma,
{x..y}
será expandido para todos os valores dex
paray
, inclusive. Por exemplo,{2..5}
será expandido para2
,3
,4
,5
.Na segunda forma explícita,
{x,y}
será expandido para únicax
,y
. Por exemplo,{2,5}
será expandido para2
e5
.Se nenhuma expansão for possível, o padrão será tratado literalmente, por exemplo, em
{a..3}
.O importante a ser observado é que a expansão de chaves será realizada (se possível), independentemente de qualquer correspondência de arquivo, enquanto estiver na criação / correspondência de arquivo.
[]
é conhecido como padrão de expansão do nome do caminho (ou globbing). Ao contrário da expansão entre chaves, você só pode usá-lo enquanto estiver combinando nomes de arquivos, ele será tratado literalmente se você o usar durante a criação de arquivos.Tem duas formas:
[xyz...]
e[x-y]
.Na primeira forma, ele corresponderá a qualquer caractere único entre colchetes separadamente, ou seja, cada caractere será tratado individualmente. Assim, para
[25].txt
ele vai corresponder a um arquivo chamado2.txt
ou5.txt
do diretório atual, enquanto que para[245].txt
isso irá corresponder a qualquer arquivo chamado2.txt
ou4.txt
ou5.txt
.Na segunda forma, uma expansão de intervalo é feita primeiro antes de corresponder individualmente, se possível, caso contrário, seja tratado literalmente. Portanto
[2-5]. txt
, corresponderá a qualquer arquivo nomeado2.txt
ou3.txt
ou4.txt
ou5.txt
. Se o intervalo não puder ser expandido, será tratado literalmente, por exemplo, no caso de[a-3].txt
.Uma diferença comportamental importante entre esses dois é quando há mais padrões para corresponder, enquanto menos na verdade é correspondido. Como a expansão de chave é feita, não importa o que aconteça, mostrará o erro de que certos arquivos não existem enquanto a expansão do nome do caminho corresponderá ao possível, sem nenhum erro para o restante:
Nota de portabilidade:
O
[]
operador de expansão do nome do caminho é definido pelo POSIX, portanto, portátil entre o shell e os derivados Bourne.A expansão de brace,,
{}
não é definida pelo POSIX, portanto, não é portátil entre todos os shells. Por exemplo,dash
(sh
no Ubuntu) não tem isso. Ele foi emprestadocsh
e vai trabalhar em certas conchas única por exemplobash
,zsh
,ksh93
,fish
. Verifique se o shell que você está usando suporta isso antes da implementação.Exemplo:
fonte
[
]
expansão quando não houver correspondências, pois isso pode ser diferente dependendo da configuração do shell. Se você deseja usar[
ou]
em um nome de arquivo, ele deve ser citado em seus comandos. Também vale a pena notar a diferença entre{13..79}
e[13-79]
. O primeiro irá produzir todos os números na faixa de13
a79
, o segundo irá coincidir com os personagens1
,3
,4
,5
,6
,7
, e9
.nullglob
(ou similar). Sobre a[13-79]
correspondência, acho que mencionei claramente na minha resposta sobre o comportamento por caractere de [] `.ksh
tem esse recurso, mas não é sabores mais modernos, como mksh e pkdshA principal diferença entre as duas formas é ilustrada aqui:
inv[15].txt
é um glob e expandirá a lista de arquivos correspondentes em seu sistema de arquivos. Essa é a expansão do nome do caminho .inv{1,5}.txt
expande parainv1.txt
einv5.txt
independentemente de quais arquivos estão realmente no seu sistema de arquivos. Isso é expansão de chaves .fonte
ba{con,tman}
e não há equivalente usando colchetes. IOW, a expansão de chaves não é apenas para caracteres únicos.