¿Cómo encuentro archivos que no contienen un patrón de cadena dado?

¿Cómo averiguo los archivos en el directorio actual que no contienen la palabra foo (usando grep )?

Si su grep tiene la opción -L (o – --files-without-match ):

 $ grep -L "foo" * 

Echa un vistazo a ack . Hace la exclusión .svn automáticamente, le da expresiones regulares de Perl y es una simple descarga de un solo progtwig Perl.

El equivalente de lo que estás buscando debería ser, en ack :

 ack -L foo 

El siguiente comando me da todos los archivos que no contienen el patrón foo :

 find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0 

El siguiente comando excluye la necesidad de que el descubrimiento filtre las carpetas svn utilizando un segundo grep .

 grep -rL "foo" ./* | grep -v "\.svn" 

Realmente necesitarás:

 find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$ 

Tuve buena suerte con

 grep -H -E -o -c "foo" */*/*.ext | grep ext:0 

Mis bashs con grep -v me dieron todas las líneas sin “foo”.

Mi grep no tiene ninguna opción -L. Encuentro una solución para lograr esto.

Las ideas son:

  1. para volcar todo el nombre de archivo que contiene la cadena merecida a un txt1.txt.
  2. volcar todo el nombre del archivo en el directorio a un txt2.txt.
  3. marque la diferencia entre el archivo de 2 volcados con el comando diff.

     grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt grep * *.log | cut -c1-14 | uniq > txt2.txt diff txt1.txt txt2.txt | grep ">" 

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

Puede especificar el filtro en “buscar” y la cadena de exclusión en “grep -vwE”. Use mtime en find si necesita filtrar en tiempo modificado también.

The Silver Searcher – Ag

Como una poderosa alternativa a grep , podrías usar The Silver Searcher – Ag :

Una herramienta de búsqueda de código similar a ack, con un enfoque en la velocidad.

En cuanto a man ag , encontramos la opción -L o --files-without-matches :

 ... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches. 

Es decir, para buscar recursivamente archivos que no coinciden con foo , desde el directorio actual:

 ag -L foo 

Para buscar solo en el directorio actual los archivos que no coinciden con foo , simplemente especifique --depth=0 para la recursión:

 ag -L foo --depth 0 
 grep -irnw "filepath" -ve "pattern" 

o

 grep -ve "pattern" < file 

el comando anterior nos dará el resultado cuando -v encuentre el inverso del patrón que se está buscando

El siguiente comando podría ayudarlo a filtrar las líneas que incluyen la subcadena “foo”.

 cat file | grep -v "foo"