Necesito eliminar todos los archivos en un directorio, pero excluir algunos de ellos. Por ejemplo, en un directorio con los archivos a b c ... z
, necesito eliminar todo excepto para u
y p
. ¿Hay una forma fácil de hacer esto?
Necesito eliminar todos los archivos en un directorio, pero excluir algunos de ellos. Por ejemplo, en un directorio con los archivos a b c ... z
, necesito eliminar todo excepto para u
y p
. ¿Hay una forma fácil de hacer esto?
Respuestas:
Lo que hago en esos casos es escribir
rm *
Luego presiono Ctrl+ X, *para expandir *
a todos los nombres de archivo visibles.
Luego puedo eliminar los dos archivos que me gusta mantener de la lista y finalmente ejecutar la línea de comando.
*
expande también no sea demasiado larga. : -}
Ctrl
+ Shift
+ x
+*
Para rm
todos, pero u,p
en bash solo escriba:
rm !(u|p)
Esto requiere que se configure la siguiente opción:
shopt -s extglob
Ver más: glob - Greg's Wiki
shopt -s extglob
, @Ashot. Además, son solo archivos, no directorios, por eso he eliminado las -rf
opciones en su comando.
rm !(index).html
. Esto eliminará todos los archivos que terminen en ".html" con la excepción de "index.html".
Puedes 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 solo el directorio especificado ( find
por defecto atraviesa directorios)-type f
procesará solo archivos (y no, por ejemplo, directorios)-delete
borrará los archivosLuego puede ajustar las condiciones mirando la página de manual de find
Actualizar
Pruebe su comando primero usando en -print
lugar de-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
justo después .
, será un desastre (eliminará todos los archivos en CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
es mi mejor amigo, especialmente cuando hay demasiados archivos para bloquear
Sencillo:
mv
los archivos que desea en un directorio superior, rm
el directorio y luego mv
los devuelve.
rm
sin -r
no eliminará subdirectorios.
Algo similar a esta respuesta, pero no se necesitan opciones especiales, por lo que sé, la siguiente es una funcionalidad "antigua" compatible con cualquier shell (vagamente) / bin / sh que se parezca (por ejemplo, bash, zsh, ksh, etc.)
rm [^up]
rm [^up]*
? Hago cosas similares con bastante frecuencia.
Haciéndolo sin encontrar:
ls | grep -v '(u|p)' | xargs rm
(Editar: "u" y "v", como en otros lugares aquí, se están utilizando como versiones genéricas de expresiones regulares completas. Obviamente, querrás tener cuidado de anclar tus expresiones regulares para evitar emparejar demasiadas cosas).
Definitivamente vas a querer un script si vas a hacer mucho de esto, como han sugerido otros.
-E
oegrep
u
o unp
grep -L (u|p)' * | xargs rm
donde -L
significa listar nombres de archivos que no contienen una coincidencia.
u
o p
, no cualquier archivo que contenga a u
o a p
. Eso es correcto. Puede corregir mediante el usoegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
En la era de los disquetes, tenía un ejecutable de dos llamado "Excepto" que movería las cosas del directorio actual temporalmente y ejecutaría un comando, por lo que podría decir:
excepto * .txt del *. *
para eliminar todo menos tus archivos de texto.
Esto sería algo bastante trivial para implementar como un script de shell y si este es el tipo de cosas que es probable que haga más de dos veces, parece que sería una buena idea.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Esto eliminará todos los archivos excepto U y P en Unix
Para aquellos que prefieren especificar patrones de exclusión complejos arbitrarios (que abarcan todos los nombres de archivos afectados) en un estilo completo de expresiones regulares emacs, posix-awk o posix-extended (consulte la página del manual 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
-regextype
solo funcionará en versiones de GNU
find
es una extensión de find
comando GNU . Lo mismo se aplica para la -regextype
opción. Además, su comando también eliminará archivos en subdirectorios, mientras que la pregunta original claramente se refería a los archivos en un directorio.
Aquí hay otra variante. Puedes escribir:
rm -i *
o:
rm --interactive *
Por rm
lo tanto, le pedirá que confirme la eliminación de cada archivo.
Utilizar:
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.
Una forma simple que es difícil de arruinar: supongamos que desea eliminar todo excepto * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp