Comportamiento extraño para buscar si el patrón siguiente -nombre no está entrecomillado

Comportamiento extraño para buscar si el patrón siguiente -nombre no está entrecomillado

Es tan extraño que a veces el siguiente patrón de -name en buscar puede buscar inesperadamente todos los nombres de archivos correspondientes con éxito. Por derechos, solo podía buscar un nombre de archivo correspondiente en el directorio actual a través del análisis del shell (no encontrar la utilidad sin comillas).

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

Respuesta1

Sin ninguna cotización *.txtestá sujeto aexpansión de nombre de ruta (también conocida como expansión de nombre de archivo). Esto sucede en eldirectorio de trabajo actual(CWD). Si el CWD contiene archivos con extensión 'txt', antes de llamar findal shell, reemplaza el *.txtparámetro con los nombres de archivo coincidentes y su comando se convierte en algo como esto:

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

Hay al menos tres resultados que puedes obtener dependiendo de si la expansión regresa...

  • ...varios archivos:obtendrás un error
  • ...un archivo y su nombre coincide con un nombre de archivo en las rutas en las que se está ejecutando find:la -nameprueba coincidirá solo con ese archivo
  • ...un archivo y no coincide con ningún archivo en las rutas buscadas: -nameno coincidirá con nada

Por otro lado, si la CWD nonocontiene archivos de texto, luego *.txtse pasa findy se comporta exactamente igual que si lo hubiera citado.

Moraleja: cuando lo use, findcoloque siempre comillas alrededor de los patrones que contengan globos, a menos que realmente desee que se produzca la expansión del nombre de la ruta (rara vez verá que esto se haga intencionalmente para la -nameopción).

información relacionada