2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

¿Cómo eliminar todos los archivos de un directorio excepto algunos?

Necesito eliminar todos los archivos de un directorio, pero excluyendo algunos de ellos. Por ejemplo, en un directorio con los archivos a b c ... z, necesito eliminar todos excepto u y p. ¿Hay alguna manera fácil de hacer esto?

Respuestas (17)

144
144
144
2013-01-08 12:34:49 +0000

Para rm todo menos u,p en bash sólo tienes que escribir:

rm !(u|p)

Esto requiere que la siguiente opción esté configurada:

shopt -s extglob

Ver más: glob - Greg’s Wiki

108
108
108
2013-01-08 12:18:23 +0000

Lo que hago en esos casos es escribir

rm *

Luego presiono Ctrl+X,* para expandir * en todos los nombres de archivos visibles.

Luego sólo tengo que quitar de la lista los dos archivos que quiero conservar y finalmente ejecutar la línea de comandos.

71
71
71
2013-01-08 12:35:05 +0000

Puede usar find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! niega la siguiente expresión
  • -name especifica un nombre de archivo
  • -maxdepth 1 hará que find procese sólo el directorio especificado (find por defecto atraviesa los directorios)
  • -type f procesará sólo archivos (y no por ejemplo directorios)
  • -delete borrará los archivos

Luego puede afinar las condiciones mirando la página man de find

Actualización

  • Tenga en cuenta que el orden de los elementos de las expresiones es significativo (vea la documentación)
  • Pruebe su comando primero usando -print en lugar de -delete
43
43
43
2013-01-08 12:22:58 +0000

Simple:

mv los archivos que quieras en un directorio superior, rm el directorio y luego mv los devuelves.

15
15
15
2013-01-08 14:22:21 +0000

Algo similar a esta respuesta pero no se necesitan opciones especiales, hasta donde yo sé lo siguiente es una funcionalidad “antigua” soportada por cualquier shell (vagamente) parecido a /bin/sh (por ejemplo, bash, zsh, ksh, etc)

rm [^up]
11
11
11
2013-01-09 03:54:14 +0000

Hacerlo sin find:

ls | grep -v '(u|p)' | xargs rm

(Edición: “u” y “v”, como en otros lugares aquí, se están utilizando como versiones genéricas de regexes enteras. Obviamente, usted querrá tener cuidado de anclar sus regexes para evitar que coincida con demasiadas cosas).

Definitivamente vas a querer un script si vas a hacer mucho de esto, como otros han sugerido.

6
6
6
2013-01-09 22:34:13 +0000

En zsh:

setopt extended_glob # probably in your .zshrc

luego

rm ^(u|p)

o

rm *~(u|p)

La segunda funcionará incluso si tienes ^ en $histchars para la sustitución de la historia, y por supuesto puedes poner un glob arbitrario antes del ~.

5
5
5
2013-01-08 16:32:06 +0000

GLOBIGNORE toma una lista separada por dos puntos

GLOBIGNORE=u:p
rm *
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Esto borrará todos los archivos excepto u y p en unix

3
3
3
2013-01-08 17:02:15 +0000

En la época de los disquetes tenía un ejecutable de dos llamado “Except” que movía cosas fuera del directorio actual temporalmente y ejecutaba un comando, así que podías decir:

except \*.txt del \*.\*

para borrar todo menos tus archivos de texto.

Esto sería una cosa bastante trivial para implementar como un script de shell y si esto es el tipo de cosa que es probable que haga más de dos veces parece que sería una buena idea.

2
2
2
2013-01-08 18:16:45 +0000

Para aquellos que prefieren especificar patrones de exclusión complejos y arbitrarios (que abarcan todos los nombres de archivo afectados) en un estilo completo de regexp emacs, posix-awk o posix-extended (ver la página man de find) recomendaría este. Excluye u y p en el directorio actual en este ejemplo. Esto puede ser útil para los scripts.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

Otra más:

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

Es un poco largo y no sé si se podría convertir fácilmente en una función que pudiera acomodar un número arbitrario de argumentos, pero funciona bien.

Y es pura bondad de bash.

1
1
1
2014-10-22 12:37:57 +0000

Aquí hay otra variante. Puedes escribir:

rm -i *

o:

rm --interactive *

Entonces rm le pedirá que confirme la eliminación de cada archivo.

1
1
1
2016-09-11 02:33:03 +0000

Utilice:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

para eliminar todos los archivos, incluidos los directorios, excepto los archivos u, p y .ext.

1
1
1
2013-01-09 20:54:59 +0000

Yo siempre uso:

rm [a-o,q-t,v-z]*

Esto le permitirá definir cuán granular quiere hacerlo. Así que si usted quiere eliminar a través de o y Z archivos que usted puede utilizar:

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

Otra versión que utiliza xargs:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

Tenga en cuenta que xargs -I es necesario para manejar correctamente los nombres de archivo que incluyen espacios.

0
0
0
2013-10-22 07:06:44 +0000

Una forma sencilla y difícil de estropear: digamos que quieres borrar todo excepto *.pdf:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp