Estoy tratando de construir un comando de búsqueda para procesar un montón de archivos en un directorio usando dos ejecutables diferentes. Desafortunadamente, -exec
on find no permite usar pipe o incluso \|
porque el shell interpreta ese carácter primero.
Esto es específicamente lo que estoy tratando de hacer (que no funciona porque la tubería finaliza el comando de búsqueda):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
Con
-exec
solo puede ejecutar un único ejecutable con algunos argumentos, no comandos de shell arbitrarios. Para evitar esto, puede usarsh -c '<shell command>'
.Tenga en cuenta que el uso de
-exec
es bastante ineficiente. Para cada archivo que se encuentre, el comando debe ejecutarse nuevamente. Sería más eficaz si pudiera evitarlo. (Por ejemplo, moviendo elgrep
fuera de la-exec
o las tuberías de los resultados defind
axargs
como se sugiere por Palmin .)fuente
find
yxargs
.Utilizando
find
comando para este tipo de tarea quizás no sea la mejor alternativa. Utilizo el siguiente comando con frecuencia para encontrar archivos que contienen la información solicitada:for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
fuente
Como esto genera una lista, ¿no:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123
o
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123
Ponga su grep en los resultados de la búsqueda -exec.
fuente
Hay otra forma de hacerlo, pero también es bastante gueto.
Usando la opción de shell extquote, puede hacer algo similar a esto para encontrar cosas ejecutivas y luego canalizarlas a sh.
root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh filename
root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh h
Pensé que lo agregaría porque al menos de la forma en que lo visualicé, estaba más cerca de la pregunta original del OP de usar tuberías dentro de exec.
fuente