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




renamer wav (10)

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


Answers

Informe de error abierto

Como comentó @tukan, hay un informe de error abierto para Ag con respecto a la bandera -L / --files-without-matches :

Como hay poco progreso en el informe de errores, no se debe confiar en la opción -L menciona a continuación, siempre y cuando el error no se haya resuelto. Utilice diferentes enfoques presentados en este hilo en su lugar. Citando un comentario para el informe de error [énfasis mío]:

¿Alguna actualización sobre esto? -L ignora por completo las coincidencias en la primera línea del archivo. Parece que si esto no va a solucionarse pronto, la bandera debe eliminarse por completo, ya que efectivamente no funciona como se anuncia .

The Silver Searcher - Ag (función prevista - ver informe de error)

Como una poderosa alternativa a grep , puedes usar 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 los 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

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

Tuve buena suerte con

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

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


Realmente necesitarás:

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

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 merecida a un txt1.txt.
  2. volcar todo el nombre del archivo en el directorio a un txt2.txt.
  3. haga la diferencia entre el archivo de volcado 2 con 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 ">"
    

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

cat file | grep -v "foo"

grep -irnw "filepath" -ve "pattern"

o

grep -ve "pattern" < file

El comando anterior nos dará el resultado, ya que -v encuentra el inverso del patrón que se está buscando.


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

El equivalente de lo que buscas debe ser, en ack :

ack -L foo

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

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


shutil tiene muchos métodos que puedes usar. Uno de los cuales es:

from shutil import copyfile

copyfile(src, dst)

Copie el contenido del archivo llamado src a un archivo llamado dst . La ubicación de destino debe ser escribible; de lo contrario, se generará una excepción IOError . Si dst ya existe, será reemplazado. Los archivos especiales como los dispositivos de caracteres o bloques y las tuberías no se pueden copiar con esta función. src y dst son nombres de ruta dados como cadenas.





file grep directory find