En pocas palabras, obtuve una carpeta con casi 800.000 archivos php. Me gustaría buscar una cadena en cada archivo y, si existe en ese archivo, el archivo se copia a otro directorio.
¿Es esto posible desde la terminal?
Hasta ahora obtuve:
grep -i -n -r 'ppr-1792' * | cp $1 mover_a_aquí
Pero esto obviamente no funciona. $1 debe ser el nombre del archivo que contiene texto coincidente.
¿Qué tengo que hacer?
Respuesta1
Puede usar un bucle for y probar el código de retorno de grep, o usar grep -c
(contar coincidencias) y ver si el recuento de coincidencias es mayor que 1.
p.ej
for i in *
do
grep -i -n 'Power' "$i"
if [ "$?" -eq 0 ]
then
cp "$i" mvd
fi
done
Respuesta2
Puedes hacerlo fácilmente con una bonita línea:
grep -l -i -r -Z pattern | xargs -0 -I source cp source /target
Algunos comentan cómo funciona. La opción -l de Grep imprime solo un nombre de archivo si hay una coincidencia en el archivo, por lo que produce una lista de archivos para copiar. El comando Xargs construye un comando para cada comando de copia y lo ejecuta. Xargs reemplaza el argumento denominado "fuente" con un nombre de archivo leído desde la entrada estándar. Los espacios y otros caracteres divertidos en los nombres de archivos se manejan con las opciones -Z y -0.