Respuestas:
Usando un patrón de globo extendido en bash
:
rm ./!(*999*)
Esto requiere shopt -s extglob
estar habilitado (y por seguridad, también shopt -s failglob
, para que ningún archivo con el nombre inusual !(*999*)
se elimine por error si todos los nombres de archivo contienen 999
). El patrón !(*999*)
coincidirá con cualquier nombre en el directorio actual, excepto aquellos nombres que coincidan *999*
. Para eliminar también archivos ocultos (archivos cuyo nombre comienza con un punto ), habilite también la dotglob
opción.
Para preocuparse solo por los archivos regulares o los enlaces simbólicos a los archivos regulares (no directorios, etc.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
El zsh
shell equivalente al bucle anterior sería
rm ./(^(*999*))(.)
Su primer comando no funcionará ya grep
que buscará dentro de los archivos. Eliminaría todos los archivos que tienen líneas sin 999
ellos (si hubiera agregado la --null
opción para que funcione xargs -0
).
Su segundo comando no funcionará ya que grep
en macOS no es compatible --null-data
(sin embargo, tiene una --null
opción, pero solo para generar la salida del nombre de archivo). También tenga en cuenta que buscaría en 999
cualquier lugar de la ruta del archivo (incluidos los componentes del directorio), no solo el nombre del archivo.
failglob
opción o podría terminar eliminando el archivo llamado !(*999*)
si no hay otro archivo cuyo nombre no contenga 999
.
Simplemente invierta la condición del nombre en find
:
find . -type f \! -name "*999*"
Agregar -delete
o -exec rm {} +
para eliminar realmente los archivos coincidentes.
!
está a salvo en bash
.
grep -l
hace que enumere los archivos donde se encontró una coincidencia (o no se encontró con-v
) en el contenido , no el nombre de archivo.grep
siempre coincide con el contenido de los archivos que especifique, nunca sus nombres.