Pregunta comodines en find y ls


Estoy tratando de descubrir las comodines para hacer operaciones de archivos.

Tengo estos archivos en un directorio para fines de prueba:

file_BSD.GIF  file_linux.gif  file_unix

Ver mi comando ls,

$ ls *{.GIF,.gif}
file_BSD.GIF  file_linux.gif

Lo cual está bien.

Pero "encontrar" no parece funcionar de la misma manera:

$ find -name *{.GIF,.gif}
find: paths must precede expression: file_linux.gif
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Por cierto, he leído que "-iname" debería ubicar los archivos en mayúscula y minúscula, pero eso tampoco parece funcionar:

$find -iname *.gif

./file_linux.gif

(Esto también debería ubicar el archivo .GIF, ¿verdad?).


21
2017-11-16 20:18


origen


Respuestas:


find -name *{.GIF,.gif} Está Mal.

Este comando se ve agravado por el shell para find -name *.GIF *.gif

Luego se expandió hasta

find -name file_BSD.GIF  file_linux.gif 
# as you have only these files in directory

Ahora esto -name file_BSD.GIF file_linux.gif se pasa a find. Y esto es incorrecto ya que no hay cambio como file_linux.gif eso es aceptado por find.

Lo que necesitas es este comando.

find -name '*.GIF' -or -name '*.gif'

Que es lo mismo que

find -iname '*.gif'

Tenga en cuenta las comillas simples (') aquí. Significa *.GIF debe enviarse para encontrar como es sin ninguna expansión de shell Y Find usará esto como patrón. Esta única cita es necesaria a menos que escapes los metacaracteres del intérprete de comandos. En ese caso, el comando se vería como

find -iname \*.gif

34
2017-11-16 20:26



Estás teniendo problemas con el parámetro -iname de find porque debes citar los patrones que le das.

Entonces, debes hacer:

find -iname '*.gif'

Esto se indica en el manual:

"... Tenga en cuenta que debe citar patrones como algo normal, de lo contrario, el shell expandirá cualquier carácter comodín en ellos".


7
2017-11-16 20:28



Debería entender que (a diferencia de Windows) el shell está expandiendo *{.GIF,.gif} antes de pasarlo al find programa.

Puedes sentir lo que hace el caparazón reemplazando el programa con echo.

Entonces debería citar el argumento del programa, como

   echo \-name '*{.GIF,.gif}'

así que corre

   find -name '*.{GIF,gif}'

Quizás quieras

   find -name '*.gif' -o -name '*.GIF'

Por favor lea el Guía avanzada de scripts de Bash (y tal vez el execve (2) página man, para entender cómo el kernel ejecuta programas).


3
2017-11-16 20:28