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 fa-type dy añadir-rla opción arm.En
bash, para usarrm -- !(file.txt), debe habilitar extglob :(o llamando
bash -O extglob)Tenga en cuenta que
extglobsolo funciona en labashfamilia de shell Korn. Y el usorm -- !(file.txt)puede causar unArgument list too longerror.En
zsh, puede usar^para negar el patrón con el globo extendido habilitado:o usando la misma sintaxis con
kshybashcon opcionesksh_globyno_bare_glob_qualhabilitado.fuente
rmasecho 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-deletelugar de-exec, más corto y más fácil de recordar-deleteno está definido por POSIX.findsolució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 lagrepsintaxis normal .grepperorm.rmobtendrá 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 directoryyrm: d: No such file or directory-print0enfindy-0enxargs. 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, gnuparallelmaneja 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
rmytar -x.rmpuede 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
findsolución que le di no funcionó?file.txto cualquier otra cosa?"shoptNo es unatcshconstrucció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
rmque no eliminará carpetas:fuente
Creo que este enfoque es muy simple, funciona y no requiere ninguna extensión especial (¡que yo sepa!)
fuente