¿Estás seguro de que está sucediendo lo que quieres? Cuando ejecutas ls /directory | grep '[^term]'
esencialmente estás buscando no las letras t e r m. Esto significa que si un archivo tiene otras letras en su nombre, seguirá apareciendo en la salida de ls
. Tome el siguiente directorio por ejemplo:
$ ls
alpha brave bravo charlie delta
Ahora si ejecuto ls |grep '^[brav]'
Obtengo lo siguiente:
$ ls |grep '^[brav]'
alpha
brave
bravo
Como puede ver, no solo obtuve brave
y bravo
También obtuve alpha
porque la clase de carácter []
recibirá cualquier carta de esa lista.
En consecuencia, si ejecuto ls |grep '[^brav]'
Obtendré todos los archivos que no contengan los caracteres b r a v en cualquier lugar en el nombre.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Si nota que incluía la lista completa del directorio porque todos los archivos tenían al menos uno letra que no estaba incluida en la clase de caracteres.
Entonces, como dijo Kanvuanza, buscar el inverso de "término" en lugar de los caracteres t e r m
deberías hacerlo usando grep -v
.
Por ejemplo:
$ ls |grep -v 'brav'
alpha
charlie
delta
Además, si no desea los archivos que tienen caracteres en la clase, use grep -v '[term]'
. Eso evitará que aparezcan archivos que tengan alguno de esos caracteres. (Respuesta de Kanvuanza)
Por ejemplo:
$ ls |grep -v '[brav]'
Como puede ver, no había archivos en la lista porque todos los archivos en este directorio incluían al menos una letra de esa clase.
Anexo:
Quería agregar que usando PCRE es posible usar solo expresiones regulares para filtrar usando expresiones negativas. Para hacer esto, usaría algo conocido como una expresión regular de anticipación negativa:(?!<regex>)
.
Entonces, usando el ejemplo anterior, puede hacer algo como esto para obtener los resultados que desea sin usar grep
banderas.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Para deconstruir esa expresión regular, primero coincide con el comienzo de una línea ^
y luego busca cadenas que no coincidan con brav
para seguir después. Solo alpha
, charlie
y delta
coinciden, por lo que esos son los únicos que se imprimen.
Supongo que grep -v
bandera hace lo que quieres. Desde la página del manual:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Puedes usar ls /directory | grep -v [term]
para imprimir cualquier línea que no coincida.