Comportamento estranho para localizar se o padrão seguinte -nome não é citado

0

É tão estranho que, às vezes, o seguinte padrão de -name em find possa procurar inesperadamente todos os nomes de arquivos correspondentes com sucesso. Por direito, ele só poderia pesquisar um nome de arquivo correspondente no diretório atual por meio da análise de shell (não encontrar o utilitário sem citações).

find /tmp -type f -name *.txt

/tmp/amp_iostat.txt
/tmp/awrrpt_1_7950_7973.txt
/tmp/oplanlog/osys/2014-07-01-12-26-28/log.txt
/tmp/oplanlog/osys/2014-07-01-13-15-33/log.txt
/tmp/oplanlog/osys/2014-07-01-13-17-58/log.txt
/tmp/oplanlog/osys/2014-07-01-13-30-27/log.txt
/tmp/oplanlog/osys/2016-10-27-19-38-50/log.txt
/tmp/pms2_20170427.txt
/tmp/pmsdb1_20170622.txt
/tmp/pmssh1_20160728.txt
/tmp/pmssh1_20160831.txt
/tmp/pmssh1_20161227.txt
/tmp/pmssh1_20170328.txt
/tmp/pmssh1_20170523.txt
/tmp/pmssh1_20170727.txt
/tmp/pmssh1_20170822.txt
/tmp/pmssh2_20170328.txt
/tmp/pmssh_20170119.txt
/tmp/pmssh_20170220.txt
/tmp/sgpms_20140717_1736_summary.txt
/tmp/sgpms_20140717_1736_trace.txt
/tmp/sgpms_20140717_1737_summary.txt
/tmp/sgpms_20140717_1737_trace.txt
/tmp/sgpms_20140717_1739_summary.txt
/tmp/sgpms_20140717_1739_trace.txt
/tmp/sgpms_20140717_1743_summary.txt
/tmp/sgpms_20140717_1743_trace.txt
/tmp/sgpms_20140717_1749_summary.txt
/tmp/sgpms_20140717_1749_trace.txt
/tmp/sgpms_20140717_1751_summary.txt
/tmp/sgpms_20140717_1751_trace.txt
find /tmp -type f -name *.txt|wc -l
      31
    
por lylklb 02.12.2017 / 09:56

1 resposta

4

Sem nenhuma citação, *.txt está sujeito a expansão do nome do caminho (também conhecido como expansão de nome de arquivo) . Isso acontece no diretório de trabalho atual (CWD). Se o CWD contiver quaisquer arquivos com extensão 'txt', antes de chamar find , o shell substitui o parâmetro *.txt pelos nomes de arquivos correspondentes e seu comando se torna algo assim:

find /tmp -type f -name file1.txt file2.txt file3.txt ...

Existem pelo menos três resultados que você pode obter dependendo se a expansão retorna ...

  • ... vários arquivos: você receberá um erro
  • ... um arquivo e seu nome correspondem a um nome de arquivo no (s) caminho (s) em que você está executando find : o -name teste corresponderá a apenas esse arquivo
  • ... um arquivo e não corresponde a nenhum arquivo no (s) caminho (s) pesquisado (s): -name não corresponderá a nada

Por outro lado, se o CWD não contiver quaisquer arquivos txt, então *.txt será passado para find e se comportará exatamente como se você o tivesse citado.

Moral: ao usar find , sempre coloque aspas em torno dos padrões que contêm globs, a menos que você realmente deseje que a expansão do nome de caminho ocorra (raramente você veria isso feito intencionalmente para a opção -name ).

    
por 02.12.2017 / 10:15

Tags