Comportamento estranho para descobrir se o padrão seguinte -nome não está entre aspas

Comportamento estranho para descobrir se o padrão seguinte -nome não está entre aspas

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

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

Responder1

Sem qualquer cotação *.txtestá sujeito aexpansão do nome do caminho (também conhecida como expansão do nome do arquivo). Isso acontece nodiretório de trabalho atual(CWD). Se o CWD contiver algum arquivo com extensão 'txt', antes de chamar findo shell, substitua o *.txtparâmetro pelos nomes de arquivo correspondentes e seu comando se tornará 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 retornará...

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

Por outro lado, se o CWD nãonãocontém qualquer arquivo txt e *.txté passado para ele finde se comporta exatamente da mesma forma como se você o citasse.

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

informação relacionada