O que o ponto de interrogação no comando do terminal significa?

Respostas:

15

Esses são chamados curingas (padrões de globbing)

Os curingas padrão (também conhecidos como padrões de globbing) são usados ​​por vários utilitários de linha de comando para trabalhar com vários arquivos.
Os curingas padrão são usados ​​por praticamente qualquer comando (incluindo mv, cp, rm e muitos outros).

  • (question mark)

    isso pode representar qualquer caractere único. Se você especificou algo na linha de comando como "hd?" O GNU / Linux procuraria hda, hdb, hdc e todas as outras letras / números entre az, 0-9.

  • *(asterisk)

    isso pode representar qualquer número de caracteres (incluindo zero, ou seja, zero ou mais caracteres). Se você especificou um "cd *", ele usaria "cda", "cdrom", "cdrecord" e qualquer coisa que comece com "cd", incluindo também o próprio "cd". "m * l" poderia por moinho, mull, ml e qualquer coisa que comece com um me termina com um l.

  • [ ] (square brackets)

    especifica um intervalo. Se você m [a, o, u] m pode se tornar: mam, mãe, mãe, se você fez: m [ad] m, pode se tornar qualquer coisa que comece e termine com m e tenha qualquer caractere a entre d. Por exemplo, eles funcionariam: mam, mbm, mcm, mdm. Esse tipo de curinga especifica um relacionamento "ou" (você só precisa de um para corresponder).

  • { } (curly brackets)

    os termos são separados por vírgulas e cada termo deve ser o nome de algo ou um curinga. Esse curinga copiará qualquer coisa que corresponda a caracteres curinga ou nomes exatos (um "ou" relacionamento, um ou outro).


Por exemplo, isso seria válido:

  • cp { .doc, .pdf} ~

    Isso copiará qualquer coisa que termine com .doc ou .pdf no diretório inicial do usuário. Observe que os espaços não são permitidos após as vírgulas (ou em qualquer outro lugar).

  • [!]

    Essa construção é semelhante à construção [], exceto que, em vez de corresponder a qualquer caractere dentro dos colchetes, ela corresponderá a qualquer caractere, desde que não esteja listada entre [e]. Este é um NÃO lógico. Por exemplo, rm myfile [! 9] removerá todos os meus arquivos * (por exemplo, myfiles1, myfiles2 etc), mas não removerá um arquivo com o número 9 em qualquer lugar em seu nome.

  • \ (backslash)

    é usado como um caractere de "escape", ou seja, para proteger um caractere especial subsequente. Portanto, "\” procura uma barra invertida. Observe que você pode precisar usar aspas e barras invertidas.

para mais exemplos: visite esta página

Usuário Registrado
fonte
3
Vale ressaltar que apt-get removerequer nomes de pacotes , não nomes de arquivos, o que torna a expansão de curingas pelo shell praticamente inútil. Se você deseja remover uma variedade de pacotes, precisa usar uma expressão regular completa, citada adequadamente para impedir que o shell tente interpretá-lo como um globo (por exemplo apt-get remove 'gnome.*').
4
Standard wildcards are used by nearly any command (including mv, cp, rm and many others).=> FALSO. esses curingas estão sendo expandidos pelo shell e o que o comando recebe é o resultado da expansão (ou seja, os arquivos que correspondem ao padrão) em vez do padrão. (se não houver nenhum arquivo que corresponda ao padrão, esse padrão será passado diretamente ao comando) #
Carlos Campderrós
17

De um modo geral, em Bash, a ?é um padrão glob que se expande para um caráter arbitrário.

Por exemplo:

$ echo Hello1 > foo1
$ echo Hello2 > foo2
$ cat foo?
Hello1
Hello2

É semelhante a a *, mas *expande para 0 ou mais caracteres, enquanto ?expande para exatamente um caractere (arbitrário).

No seu caso especial, porém, ?o comando aparentemente foi um erro de digitação.

Malte Skoruppa
fonte
Então é inútil / desnecessário no meu caso, certo?
Ooker
Sim. Na verdade, foi editado a partir da resposta à qual você vinculou quando fez sua pergunta. :)
Malte Skoruppa
1
Não consigo acreditar: -o #
Ooker 18/03
1
Mesmo se fossem curingas corretos, esse uso deve ser evitado sem citar. apt-get entender os REs, mas se um arquivo chamado gnome1existir no diretório atual, o shell o expandirá antes que o apt-get tenha alguma chance de vê-lo.
Rmano 18/03/14
@Ooker Você nunca vai esquecer isso agora!
comrademike