file - renamer - ¿Cómo encuentro archivos que no contienen un patrón de cadena dado?
tag rename (11)
¿Cómo puedo encontrar los archivos en el directorio actual que no contienen la palabra foo
(usando grep
)?
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
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
El siguiente comando excluye la necesidad de que la búsqueda filtre las carpetas svn
usando un segundo grep
.
grep -rL "foo" ./* | grep -v "/.svn"
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 podría ayudarlo a filtrar las líneas que incluyen la subcadena "foo".
cat file | grep -v "foo"
Mi grep no tiene ninguna opción -L. Encuentro una solución para lograr esto.
Las ideas son:
- para volcar todo el nombre del archivo que contiene la cadena merecida a un txt1.txt.
- volcar todo el nombre del archivo en el directorio a un txt2.txt.
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 ">"
Realmente necesitarás:
find . -not -ipath ''.*svn*'' -exec grep -H -E -o -c "foo" {} /; | grep :0/$
Si su grep tiene la opción -L
(o --files-without-match
):
$ grep -L "foo" *
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".
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.
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.