Estoy tratando de construir un comando de búsqueda para procesar un montón de archivos en un directorio usando dos ejecutables diferentes. Desafortunadamente, -execon 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
-execsolo 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
-execes bastante ineficiente. Para cada archivo que se encuentre, el comando debe ejecutarse nuevamente. Sería más eficaz si pudiera evitarlo. (Por ejemplo, moviendo elgrepfuera de la-execo las tuberías de los resultados defindaxargscomo se sugiere por Palmin .)fuente
findyxargs.Utilizando
findcomando 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; donefuente
Como esto genera una lista, ¿no:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123o
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123Ponga 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 filenameroot@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh hPensé 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