
Estoy intentando imprimir find
una lista de directorios que contienen archivos distintos de imágenes jpg, pero creo que el uso de la -exec
opción no funciona. Mi entorno es Cygwin Bash.
$ find ! -iname "*.JPG$" -exec dirname
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {}
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname ;
find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {};
find: missing argument to `-exec'
Respuesta1
A -exec
debe terminar con a ;
o a +
. Esto ;
hace que el comando se ejecute una vez por cada nombre de archivo encontrado, mientras que +
hace que el comando se ejecute una vez para todos los nombres de archivo.
Aquí hay un ejemplo práctico:
find ! -iname "*.JPG" -exec dirname {} \;
Algunas diferencias notables con respecto a sus intentos:
- Debe haber un espacio entre
{}
y\;
- Se debe utilizar un carácter
;
de escape, porque es un metacarácter de shell. - Como @muru señaló en su respuesta,
-iname
toma un pegote, no una expresión regular
Respuesta2
Intentar:
find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u
Notas;
Para completar el
-exec
comando,{}
se necesita un para mostrar dónde debe ir el nombre del archivoyse necesita un punto y coma. Debido a que el caparazón se comería un punto y coma simple, tenemos que escapar de él para que pase afind
.-iname
coincide con globos, no con expresiones regulares. Entonces, la$
entrada final"*.JPG$"
probablemente no sea la que deseas.Dijiste que quieres una "lista de directorios que contengan archivos distintos de jpg". En consecuencia, agregué
-type f
para estar seguros de que solo miramos directorios que contienen al menos un archivo.Los resultados se pasan
sort -u
para eliminar duplicados.
Respuesta3
La sintaxis:
-exec [command] ... {} ... ;
-exec [command] ... {} ... +
Dado que ;
es parte de la sintaxis del shell, debes escapar de ella para que find
la vea como un argumento:
find .. -exec dirname {} \;
Por cierto, -iname
no usa expresiones regulares, solo úsalas *.jpg
sin el archivo $
.
Ahora me sorprende que con GNU find no necesitemos usarlo dirname
en absoluto. En cambio:
find ... -printf "%h\n"