Dentro de un directorio, ¿cómo puedo eliminar archivos que carecen de alguna de las palabras especificadas, de modo que solo queden los archivos que contienen TODAS las palabras? Traté de escribir un script simple de bash shell usando los comandos grep y rm, pero me perdí. Estoy totalmente nuevo en Linux, cualquier ayuda se agradeceLinux: eliminando archivos que no contienen todas las palabras especificadas
Respuesta
Cómo sobre:
grep -L foo *.txt | xargs rm
grep -L bar *.txt | xargs rm
Si un archivo no contiene no contiene foo
, entonces la primera línea eliminará ve eso
Si un archivo no contienen bar
, a continuación, la segunda línea se eliminará.
Sólo los archivos que contienen tanto foo
y bar
deben dejarse
-L, --files-without-match
Suppress normal output; instead print the name of each input
file from which no output would normally have been printed. The
scanning will stop on the first match.
Véase también @Mykola Golubyev's post para colocar en un bucle.
En primer lugar, eliminar la lista de archivos:
rm flist
Entonces, para cada una de las palabras, añadir el archivo a la lista de archivos si contiene esa palabra :
grep -l WORD * >>flist
Entonces especie, uniqify y obtener un recuento:
sort flist | uniq -c >flist_with_count
Todos esos archivos en FLSI t_with_count que no tiene el número de palabras debe ser eliminado. El formato será:
2 file1
7 file2
8 file3
8 file4
Si hubo 8 palabras, se deben eliminar el archivo1 y el archivo2. Dejaré la escritura/prueba del guión para usted.
Vale, me has convencido, aquí está mi guión:
#!/bin/bash
rm -rf flist
for word in fopen fclose main ; do
grep -l ${word} *.c >>flist
done
rm $(sort flist | uniq -c | awk '$1 != 3 {print $2} {}')
Esto elimina los archivos en el directorio que no tenían las tres palabras:
Esto eliminará todos los archivos que no contiene palabras de ping o enviados
grep -L 'Ping\|Sent' * | xargs rm
Esto no eliminará los archivos que solo contengan una de las Palabras. –
Sí, ya lo he notado y presiono eliminar, pero ya era demasiado tarde. –
list=`Word1 Word2 Word3 Word4 Word5`
for word in $list
grep -L $word *.txt | xargs rm
done
adición a las respuestas anteriores: Utilice el carácter de nueva línea como delimitador de manejar nombres de archivo con espacios !
grep -L $word $file | xargs -d '\n' rm
grep -L palabra | xargs rm
Para ello los mismos nombres de archivo coincidentes (no el contenido de los archivos ya que la mayoría de las soluciones arriba) se puede utilizar lo siguiente:
for file in `ls --color=never | grep -ve "\(foo\|bar\)"`
do
rm $file
done
De acuerdo con los comentarios:
for file in `ls`
shouldn no ser usado El siguiente hace lo mismo sin utilizar el ls
for file in *
do
if [ x`echo $file | grep -ve "\(test1\|test3\)"` == x ]; then
rm $file
fi
done
la -ve invierte el patrón de búsqueda de la expresión regular, ya sea para foo o bar en el nombre del archivo. Cualquier otra palabra que se agregue a la lista debe estar separada por \ | p. uno \ | dos \ | tres
Usted podría intentar algo como esto, pero puede romper si los patrones contienen cáscara o grep meta caracteres:
(en este ejemplo uno dos tres son los patrones)
for f in *; do
unset cmd
for p in one two three; do
cmd="fgrep \"$p\" \"$f\" && $cmd"
done
eval "$cmd" >/dev/null || rm "$f"
done
- 1. Expresión regular eliminando todas las palabras más cortas que n
- 2. ¿Cómo mostrar todas las palabras que contienen estos caracteres?
- 3. Emacs, eliminando todas las líneas que no coinciden?
- 4. Búsqueda de texto completo de MySQL - Resultados únicos que contienen todas las palabras
- 5. Cómo cortar palabras especificadas de la cadena
- 6. Solr - sinónimos que contienen varias palabras
- 7. Seleccionar todas las tablas que contienen columnas específicas
- 8. Todas las Palabras, excepto uno
- 9. Deserialización de las respuestas JSON que contienen atributos que entran en conflicto con las palabras clave
- 10. Eliminando palabras de un NSString
- 11. ¿Cómo encontrar todas las palabras que aparecen entre paréntesis?
- 12. Regex: cómo recuperar todas las líneas que contienen strA pero no strB en Visual Studio
- 13. no todas las pruebas se ejecutan en parametrizados matrices que contienen NUnit TestFixture
- 14. Regex - Encuentra todas las palabras que coinciden que no comienzan con un prefijo específico
- 15. SQL: Encuentre filas donde Column contiene todas las palabras dadas
- 16. Eliminando prefijos y sufijos de las palabras en C#
- 17. Eliminar archivos que no contienen una cadena específica
- 18. UITableView que muestra más filas que las especificadas en numberOfRowsInSection:
- 19. Resalte todas las palabras buscadas en richtextbox
- 20. iOS eliminando las superposiciones MKMapView que no funcionan
- 21. git merge: Eliminando archivos que quiero mantener!
- 22. Rectángulo redondeado en NSView que recorta todas las subvistas que contienen
- 23. cómo encontrar archivos que contienen una cadena usando egrep
- 24. ¿Cómo puedo buscar todos los campos en SOLR que contienen las palabras clave,.?
- 25. Cómo analizar HTML para modificar todas las palabras
- 26. Cómo encontrar líneas que contienen una cadena en Linux
- 27. ¿Ajustar algunas palabras especificadas con span en jQuery?
- 28. ¿Incluye archivos PHP que contienen funciones que ralentizan las páginas con las incluidas aunque no se usen?
- 29. Eliminando todas las tareas en cola de un ThreadPoolExecutor
- 30. eliminar archivos cuando el nombre NO contiene algunas palabras
creo que los archivos con foo O bar, se eliminarán con esto. – claf
Nope - -L niega el grep. – toolkit
@toolkit: oups, mi mal. – claf