Quiero eliminar archivos que no tengan la cadena '999' (sin el '') en su nombre.
Yo he tratado:
grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --
Pero ninguno de ellos funciona. Estoy usando macOS Sierra, con bash: 3.2.57.
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.Respuestas:
Usando un patrón de globo extendido en
bash
:Esto requiere
shopt -s extglob
estar habilitado (y por seguridad, tambiénshopt -s failglob
, para que ningún archivo con el nombre inusual!(*999*)
se elimine por error si todos los nombres de archivo contienen999
). 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 ladotglob
opción.Para preocuparse solo por los archivos regulares o los enlaces simbólicos a los archivos regulares (no directorios, etc.):
El
zsh
shell equivalente al bucle anterior seríaSu primer comando no funcionará ya
grep
que buscará dentro de los archivos. Eliminaría todos los archivos que tienen líneas sin999
ellos (si hubiera agregado la--null
opción para que funcionexargs -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 en999
cualquier lugar de la ruta del archivo (incluidos los componentes del directorio), no solo el nombre del archivo.fuente
failglob
opción o podría terminar eliminando el archivo llamado!(*999*)
si no hay otro archivo cuyo nombre no contenga999
.Simplemente invierta la condición del nombre en
find
:Agregar
-delete
o-exec rm {} +
para eliminar realmente los archivos coincidentes.fuente
!
está a salvo enbash
.