bash - ejemplos - xargs rm
xargs-if condition y echo{} (4)
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.
find -iname file.xxx| xargs -I {} if grep -Fq "string" {} ; then echo {} ; fi
Los problemas son:
-
xargs
no está trabajando con la instrucción if. -
echo {}
no da el nombre del archivo, en cambio da{}
.
¿Cómo puedo arreglar esto?
Envuelva el enunciado if en una llamada a sh:
find -iname file.xxx | xargs -I {} sh -c ''grep -Fq "string" {} && { echo {}; }''
Use un ciclo 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 quieres hacer más que repetir el nombre del archivo. Si eso es todo lo que intentas hacer, utiliza la opción -l
de grep:
find -iname file.xxx | xargs grep -Fl "string"
Intenta ejecutar el comando a través de un shell como este:
$ find -iname file.xxx |
> xargs -I {} bash -c ''if grep -Fq "string" {} ; then echo {} ; fi''
donde el comando original ha sido rodeado por comillas y bash -c
.
Primero, if
es un comando bash y no hay un programa ejecutable. xargs
por otro lado, necesita un programa distinto.
Segundo, el ;
los personajes probablemente estén dividiendo el comando. Tendrás que escapar de ellos para llevarlos a xargs.
Para evitar todo esto, sugiero lo siguiente:
for i in `find -iname file.xxx` ; do grep -Fq "string" $i && echo $i ; done
find -iname file.xxx | while read FILE; do
if grep -Fq "string" $FILE ; then echo $FILE ;
done