Tengo varios archivos con el mismo nombre de archivo base. Me gustaría eliminar todos menos uno
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Si no necesito conservar uno, sé que podría usarlo rm foo.*
.
TLDP demuestra ^
negar un partido. A través de prueba y error, pude encontrar que
rm foo.*[^org]
hace lo que necesito, pero realmente no entiendo la sintaxis.
Además, aunque no es una limitación en mi caso de uso, creo que este patrón también ignora foo.o
y foo.or
. ¿Cómo funciona este patrón, y lo que sería un pegote que ignora solamente foo.org
parece?
rm foo.*[^org]
elimina todos los archivos de los cuales último carácter es nio
,r
og
, por lo quefoo.foo
no corresponde a ninguno.Regular Expression
. Debes tener cuidado con tus caracteres de agrupación. Al usar corchetes, ha especificado una clase de caracteres que significa que eliminaría cualquier archivo que tuviera una extensión con las letraso
,r
og
en cualquier orden. Use paréntesis para crear un grupo y preservar el orden de los caracteres.foo.*[^org]
coincidirá con cualquier nombre de archivo que comience confoo.
uno o más caracteres después del punto donde el último carácter no sea o, r o g. Por lo tanto, coincidiríafoo.orb
, pero nofoo.org
ofoo.or
ofoo.o
. La respuesta de GlennJackman muestra cómo habilitar las características extendidas de coincidencia de patrones para negar una coincidencia.Respuestas:
Esto es "tonto". seguido de cualquier cosa que NO sea "org"
ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
fuente
@()
para una lista de patrones: stackoverflow.com/a/217208/3779853En bash, también puedes usar
GLOBIGNORE="*.org"; rm -i foo*
.Y
unset GLOBIGNORE
cuando termine.No es realmente mejor que
shopt -s extglob
, pero me resulta más fácil de recordar.fuente
( GLOBIGNORE="*.org"; rm -i foo* )
GLOBIGNORE="*foo*:*bar*"
Una pipa puede hacer?
(obviamente, es posible que desee reemplazar echo con rm en la última cadena).
fuente
ls -1
debería ser más confiable para garantizar que todos los archivos se manejen porgrep
separadoOP estuvo muy cerca:
aunque en este caso
*
es innecesario.fuente
foo.ort
yfoo.erg