2012-02-28 8 views
8

Tengo algunos archivos que contienen una cadena en particular. Lo que quiero hacer es buscar una ubicación para el archivo; si el archivo existe grep para el patrón; si es cierto, haz algo.xargs - if condition and echo {}

find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi 

Los problemas son:

  • xargs no está trabajando con la sentencia if.
  • echo {} no da el nombre del archivo, en su lugar da {}.

¿Cómo puedo reparar esto?

+0

Por qué no tienen '' run find' grep' sí? –

+0

hacer algo en el archivo o línea grepped? –

Respuesta

18

intenta ejecutar el comando a través de una cáscara de la siguiente manera:

$ find -iname file.xxx | 
> xargs -I {} bash -c 'if grep -Fq "string" {} ; then echo {} ; fi' 

donde el comando original se ha rodeado de citas y bash -c.

5

Envuelva la sentencia if en una llamada a sh:

find -iname file.xxx | xargs -I {} sh -c 'grep -Fq "string" {} && { echo {}; }' 

uso de un bucle while en lugar de xargs

find -iname file.xxx | while read -r file; do 
    if grep -Fq "$file"; then 
    # do something 
    echo "$file" 
    fi 
done 

supongo que quiere hacer más eco del nombre de archivo. Si eso es todo lo que estamos tratando de hacer, usar la opción de grep -l:

find -iname file.xxx | xargs grep -Fl "string" 
0

En primer lugar, if es una fiesta de mando y ningún programa ejecutable. xargs por otro lado necesita un programa distinto.

En segundo lugar, los caracteres ; probablemente estén dividiendo el comando. Tendrás que escapar de ellos para llevarlos a xargs.

Para evitar todo esto le sugiero lo siguiente:

for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done 
+2

En general, no se recomienda el uso de for-loop debido a la forma en que divide la salida de find: los nombres de archivo con espacios se dividirán. Es mejor usar un ciclo while para leer los nombres de los archivos. –

+0

Buen punto. Siempre ten cuidado con los espacios! – Quota

-1
find -iname file.xxx | while read FILE; do 
if grep -Fq "string" $FILE ; then echo $FILE ; 
done 
+0

Esta respuesta se marcó como de baja calidad debido a su longitud y contenido. Sugiera agregar una descripción de lo que hace y cómo responde la pregunta. –

Cuestiones relacionadas