Qual é a diferença entre ls [13] e ls {1,3}?

11

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 aparelhos? Também estava pesquisando "linux [..]", mas não consegui encontrar nada, então eu poderia saber como essas coisas são chamadas na terminologia linux?

Obrigado

    
por posixKing 03.09.2016 / 02:48

2 respostas

14
  • {} é chamado de expansão de chave. Ele tem duas formas: {x..y} e {x,y} , substitua x e y por qualquer valor alfabético ou numérico.

    No primeiro formulário, {x..y} será expandido para todos os valores de x a y , inclusive. Por exemplo, {2..5} será expandido para 2 , 3 , 4 , 5 .

    No segundo formulário explícito, {x,y} será expandido para apenas x , y . Por exemplo, {2,5} será expandido para 2 e 5 .

    Se não for possível expansão, o padrão é tratado literalmente, e. em {a..3} .

    É importante notar que a expansão da chave será feita (se possível), independentemente de qualquer correspondência de arquivo, enquanto na criação / correspondência de arquivos.

  • [] é conhecido como um padrão de expansão de nome de caminho (ou globbing). Ao contrário da expansão de chaves, você só pode usá-la enquanto combina nomes de arquivos, e ela será tratada literalmente se você usá-la durante a criação de arquivos.

    Tem duas formas: [xyz...] e [x-y] .

    No primeiro formulário, ele corresponderá a qualquer caractere individual dentro dos colchetes separadamente, ou seja, cada personagem é tratado individualmente. Portanto, para [25].txt , ele corresponderá a um arquivo chamado 2.txt ou 5.txt no diretório atual, enquanto que para [245].txt ele corresponderá a qualquer arquivo chamado 2.txt ou 4.txt ou 5.txt .

    No segundo formulário, uma expansão de intervalo é feita primeiro antes de corresponder individualmente, se possível, tratada de outra forma literalmente. Portanto, para [2-5]. txt , ele corresponderá a qualquer arquivo chamado 2.txt ou 3.txt ou 4.txt ou 5.txt . Se o intervalo não puder ser expandido, será tratado literalmente, e. 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 da chave é feita, não importa qual, ele mostrará o erro de que certos arquivos não existem enquanto a expansão do nome do caminho corresponder ao que for possível sem qualquer erro para o resto:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

Nota de portabilidade:

O operador de expansão [] nome do caminho é definido pelo POSIX, portanto, portável entre o shell Bourne e derivados.

A expansão da chave, {} , não é definida pelo POSIX, portanto, não é portável entre todos os shells. Por exemplo, dash ( sh no Ubuntu) não tem isso. Ele foi emprestado de csh e funcionará apenas em alguns shells, por ex. bash , zsh , ksh93 , fish . Certifique-se de que o shell que você está usando suporta isso antes de implementá-lo.

Exemplo:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory
$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory
    
por heemayl 03.09.2016 / 03:59
7

A principal diferença entre as duas formas é ilustrada aqui:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txt é um glob e expandirá a lista de arquivos correspondentes em seu sistema de arquivos. Esta é a expansão do nome do caminho .

inv{1,5}.txt expande para inv1.txt e inv5.txt , independentemente de quais arquivos estão realmente em seu sistema de arquivos. Esta é a expansão da chave .

    
por John1024 03.09.2016 / 03:09