2009-11-17 9 views

Respuesta

10

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 
+3

Quiere cambiar la grep 0 al final de grep 0 $ (de lo contrario, obtendrá coincidencias erróneas en los archivos que tienen el carácter 0 en su nombre de archivo). – clouseau

+6

@clouseau es en su mayoría correcto ... Sin embargo, 'grep '0 $'' también coincidiría con archivos con múltiplos de 10 líneas. Necesitas 'grep ': 0 $'' al final para verificar un '' 0 '' explícito al final de la línea. Entonces solo obtendrá archivos con cero líneas coincidentes. – TrinitronX

+0

El UNIX en el que estoy conectado no tenía versiones de find o grep con estas opciones, así que tuve que ir con el comando "ack" sugerido en otros comentarios. –

574

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

$ grep -L "foo" * 
+27

o su equivalente usando [ack] (http://betterthangrep.com/): 'ack -L 'foo'' – asymmetric

+1

Como se señaló en otra parte, ack ayuda a evitar los archivos .svn (subversión) por defecto. – GuruM

+6

@GuruM Esto se puede hacer en GNU grep exportando la variable 'GREP_OPTIONS = '- exclude-dir = .svn --exclude-dir = .git'': ^) – bufh

5

tuve la buena suerte con

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

Mis intentos con grep -v me acaba de dar todas las líneas sin "foo".

5

Que se va a necesitar:

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

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

El equivalente a lo que estás buscando debe ser, en ack:

ack -L foo 
+4

no, eso devuelve todas las líneas que no coinciden con 'foo'. lo que está buscando es 'ack -L foo' – asymmetric

11

El siguiente comando excluye la necesidad de que el hallazgo para filtrar los svn carpetas mediante el uso de una segunda grep.

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

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

cat file | grep -v "foo" 
+0

Esto imprime las líneas que no coinciden, no los nombres de los archivos que no contienen una coincidencia en ninguna línea. Para colmo de males, es un [uso inútil de 'cat'] (http://www.iki.fi/era/unix/award.html). – tripleee

-1
grep -irnw "filepath" -ve "pattern" 

o

grep -ve "pattern" < file 

comando anterior nos dará el resultado como -v encuentra el inverso del patrón que se busca

+0

Esto imprime las líneas que no contienen el patrón. Puede agregar la opción '-l' para imprimir solo el nombre del archivo; pero esto todavía imprime los nombres de cualquier archivo que contenga * cualquier * línea que no contenga el patrón. Creo que OP quiere encontrar los archivos que no contienen ninguna línea que contenga el patrón. – tripleee

1

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

Las ideas son:

  1. para volcar todo el nombre del archivo que contiene la cadena merecía un txt1.txt.
  2. volcar todo el nombre de archivo en el directorio a un txt2.txt.
  3. hacen 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 ">" 
    
+0

Olvidé los comandos, pero en lugar de eliminar los nombres de los archivos, puedes hacer un 'diff' entre dos flujos de salida (creo que rodeas los comandos con paréntesis, y hay un paréntesis en algún lugar), si tus sistemas lo admiten , que supongo que es la pregunta, ya que no es compatible con 'grep -L' –

1

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

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

+0

Esto parece mostrarme todas las líneas sin la cadena, el OP solo solicita los nombres de los archivos. –

Cuestiones relacionadas