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 uy 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 uy 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 rmtodos, pero u,pen 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 -rfopciones 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 1hará que find procese solo el directorio especificado ( findpor 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 -printlugar de-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deletejusto después ., será un desastre (eliminará todos los archivos en CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
findes mi mejor amigo, especialmente cuando hay demasiados archivos para bloquear
Sencillo:
mvlos archivos que desea en un directorio superior, rmel directorio y luego mvlos devuelve.
rmsin -rno 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.
-Eoegrep
uo unp
grep -L (u|p)' * | xargs rmdonde -Lsignifica listar nombres de archivos que no contienen una coincidencia.
uo p, no cualquier archivo que contenga a uo 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 uy pen 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
-regextypesolo funcionará en versiones de GNU
findes una extensión de findcomando GNU . Lo mismo se aplica para la -regextypeopció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 rmlo 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