O que significa. ?? * em um comando shell?

22

O seguinte comando irá processar tar todos os arquivos e pastas "dot":

tar -zcvf dotfiles.tar.gz .??*

Estou familiarizado com expressões regulares , mas não entendo como interpretar .??* . Eu executei ls .??* e tree .??* e olhei para os arquivos que foram listados. Por que essa expressão regular inclui todos os arquivos nas pastas que começam com . , por exemplo?

    
por SabreWolfy 22.07.2012 / 18:54

3 respostas

32

Globs não são expressões regulares. Em geral, o shell tentará interpretar qualquer coisa que você digitar na linha de comando que você não citar como glob. Shells não são necessários para suportar expressões regulares (embora na realidade muitos dos mais modernos e modernos, por exemplo, o operador =~ regex match na construção bash [[ ).

O .??* é um glob. Ele corresponde a qualquer nome de arquivo que comece com um ponto literal . , seguido por quaisquer dois caracteres (não necessariamente iguais), ?? , seguido pela expressão regular equivalente a [^/]* , ou seja, 0 ou mais caracteres que não são / .

Para os detalhes completos da expansão do nome do caminho do shell (o nome completo para "globbing"), consulte o Especificação POSIX .

    
por 22.07.2012 / 18:59
8

O curinga .??* ( não uma expressão regular, embora pareça assim) se traduz em nomes de arquivos que começam com um ponto ( . ), seguidos por dois caracteres únicos ( ?? ) e, em seguida, qualquer número (zero ou mais) de outros caracteres ( * ).

Talvez essa página em Caracteres curinga nos nomes de arquivo seja útil.

    
por 22.07.2012 / 18:58
-1

Para adicionar as outras respostas, um único ? será convertido em um único nome de arquivo de caractere e ?? corresponderá a nomes de arquivo que tenham apenas dois caracteres e assim por diante.

[root@mercy testdir_2]# ls
ion  it  r
[root@mercy  testdir_2]# ls ?
r
[root@mercy  testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy  testdir_2]#
    
por 26.03.2015 / 11:08

Tags