Existe uma razão para usar vários pontos de interrogação em vez de um asterisco na expansão de nome de arquivo?

3

Se eu tiver vários diretórios nomeados, por exemplo 10001 a 10025 , há algum motivo para usar ls 1*/foo vs. ls 100??/foo ?

Eu tenho muito mais do que 25 deles, então eu principalmente curioso se há alguma diferença na velocidade.

Eu sei a diferença de uso entre os dois, que o asterisco irá coincidir com nomes de arquivos mais longos, como 10001.backup . Mas digamos que eu não tenha arquivos que não sigam minhas convenções. Existe alguma diferença nos bastidores?

    
por Azor Ahai 17.08.2015 / 23:39

2 respostas

9

Função

Eles significam coisas diferentes. O asterisco corresponde a zero a caracteres infinitos. O ponto de interrogação corresponde exatamente a um caractere.

Das referências acima:

The * character serves as a "wild card" for filename expansion in globbing.

The ? character serves as a single-character "wild card" for filename expansion in globbing…

Desempenho

tl: dr: não há diferença detectável no desempenho.

Eu testei o desempenho usando um diretório preenchido com 36 subdiretórios, cada um nomeado com um único caractere. Havia cerca de 70 000 arquivos nos subdiretórios combinados. Eu testei o seguinte.

$ time ls ?/* -d >/dev/null
$ time ls */* -d >/dev/null

Eu alternei cada comando dez vezes cada. Aqui estão os resultados para o real tempo, em segundos.

?       *
0.318   0.326
0.355   0.212
0.291   0.351
0.291   0.265
0.287   0.283
0.362   0.23
0.248   0.33
0.286   0.283
0.293   0.351
0.233   0.352

Após análise estatística (teste t pareado, bicaudal), não consegui detectar diferença entre os dois valores no desempenho (valor p = 0,95).

EDIT:Maisamostras

Repetiaanáliseacimacom200amostrascada,alternandonovamenteostestes.

$foriin{1..200};dotime(ls*/*-d>/dev/null)2>>/tmp/time_asterisk;time(ls?/*-d>/dev/null)2>>/tmp/time_question_mark;done

Aquiestãoosdadosbrutospara? e * . Mais uma vez, não consegui detectar diferença significativa (valor de p = 0,55), e a distribuição de cada teste parece mais semelhante.

    
por 17.08.2015 / 23:45
1

Os ?? são mais específicos, no caso de existirem ou poderem existir outros arquivos mais longos que o * glob corresponderia.

% touch 10001 100dalmations
% ls 100??
10001
% ls 100*
10001  100dalmations
% 
    
por 17.08.2015 / 23:45

Tags