¿Qué comando conciso puedo usar para encontrar todos los archivos que NO contienen una cadena de texto?
Intenté esto (usando -v para invertir los parámetros de grep) sin suerte:
find . -exec grep -v -l shared.php {} \;
Alguien dijo que esto funcionaría:
find . ! -exec grep -l shared.php {} \;
Pero no parece funcionar para mí.
Esta página tiene este ejemplo:
find ./logs -size +1c > t._tmp
while read filename
do
grep -q "Process Complete" $filename
if [ $? -ne 0 ] ; then
echo $filename
fi
done < t._tmp
rm -f t_tmp
Pero eso es engorroso y nada conciso.
ps: sé que grep -L *
esto hará esto, pero cómo puedo usar el comando find en combinación con grep para archivos excluidos es lo que realmente quiero saber.
pss: Tampoco estoy seguro de cómo incluir grep subdirectorios con la grep -L *
sintaxis, pero todavía quiero saber cómo usarlo con find
:)
Respuestas:
O
Aquí estamos calculando el número de líneas coincidentes (usando
-c
) en un archivo si el recuento es 0, entonces es el archivo requerido, por lo que cortamos la primera columna, es decir, el nombre de archivo de la salida.fuente
grep
se fijó esto seguiría suponer ningún nombre de archivo que contienen:
o de nueva línea caracteres ...Su hallazgo debería funcionar si cambia
-v -l
(archivos que no tienen una línea que coincida) a-L
(archivos sin líneas que coinciden), pero también podría usargrep
la-r
opción recursive ( ):fuente
find . -exec grep -v -l shared.php {} \;
(y todas las otras variantes que probé) no me funcionan. Estoy en OS X pero no creo que eso deba importar. Te di un +1 porque me había olvidado de la-r
opción.-L
Podrías usar
find
ygrep
así:Aquí
-print
se ejecuta solo si la expresión anterior: se! -exec ... {}
evalúa comotrue
.Entonces, para cada archivo encontrado,
grep -q 'PATTERN'
seexec
usa, si el resultado esfalse
entonces, toda la expresión se! -exec grep -q 'PATTERN'
evalúa comotrue
y se edita el nombre del archivoprint
.fuente
grep -L
embargo, hay una diferencia con los GNU en que también incluirá los archivos no legibles en la lista.Usted encuentra resultados no coincidentes por la opción -L
fuente
Creo que estás buscando un comando como
La opción
-q
hacegrep
salir y después de usar-execdir
necesita-print
imprimir los archivos encontrados.fuente