Tengo un directorio que contiene una gran cantidad de archivos. Quiero eliminar todos los archivos excepto file.txt. ¿Cómo hago esto?
Hay demasiados archivos para eliminar los no deseados individualmente y sus nombres son demasiado diversos para usar * para eliminarlos todos excepto este archivo.
Alguien sugirió usar
rm !(file.txt)
Pero no funciona. Vuelve:
Badly placed ()'s
Mi sistema operativo es Scientific Linux 6.
¿Algunas ideas?
file-management
Kantura
fuente
fuente
Respuestas:
POSIXY:
eliminará todos los archivos normales (recursivamente, incluidos los ocultos) excepto
file.txt
. Para eliminar directorios, cambiar-type f
a-type d
y añadir-r
la opción arm
.En
bash
, para usarrm -- !(file.txt)
, debe habilitar extglob :(o llamando
bash -O extglob
)Tenga en cuenta que
extglob
solo funciona en labash
familia de shell Korn. Y el usorm -- !(file.txt)
puede causar unArgument list too long
error.En
zsh
, puede usar^
para negar el patrón con el globo extendido habilitado:o usando la misma sintaxis con
ksh
ybash
con opcionesksh_glob
yno_bare_glob_qual
habilitado.fuente
rm
asecho rm
, y pido a las personas que solo saquen el eco cuando estén realmente seguros de que hará lo que quieran. Aparte de eso, +1 por la respuesta completa-delete
lugar de-exec
, más corto y más fácil de recordar-delete
no está definido por POSIX.find
solución de Gnouc que puede hacer,! \( -name one_file -o -name two_file \)
etc.Otra toma en una dirección diferente (si no hay espacios en los nombres de archivo)
o (funciona incluso si hay espacios en los nombres de archivo)
de
man grep
:fuente
ls | grep -v "a file with spaces.bin" | xargs rm
. Esta es lagrep
sintaxis normal .grep
perorm
.rm
obtendrá una lista de argumentos separados por espacios. Pruebetouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: obtendrárm: c: No such file or directory
yrm: d: No such file or directory
-print0
enfind
y-0
enxargs
. Aquí hay una solución, pero es un poco inconveniente.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. Por cierto, gnuparallel
maneja esto bien (casi siempre lo uso como un sustituto de xargs:ls | grep -v 'a b' | parallel rm
-
.Mantener una copia, eliminar todo, restaurar copia:
En una linea:
Pero eso requiere un shell que admita cadenas aquí.
fuente
rm
ytar -x
.rm
puede fallar tanto como quiera.Todos ustedes están pensando demasiado en esto.
Hecho.
EDITAR En realidad, más fácil:
fuente
En mi sistema operativo Scientific Linux 6 esto funciona:
También tengo Debian 32bit instalado en una máquina virtual. Lo anterior no funciona pero lo siguiente sí:
fuente
find
solución que le di no funcionó?file.txt
o cualquier otra cosa?"shopt
No es unatcsh
construcción.Usar en
rm !("file.txt")
lugar derm !(file.txt)
fuente
shopt -s extglob
. En cualquier caso, citar un nombre de archivo simple como ese no habría hecho ninguna diferencia.Solo para dar una respuesta diferente, puede usar el comportamiento predeterminado de
rm
que no eliminará carpetas:fuente
Creo que este enfoque es muy simple, funciona y no requiere ninguna extensión especial (¡que yo sepa!)
fuente