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?
123

shopt -s dotglobantes de ejecutarrm (...).Respuestas:
Lo que hago en esos casos es escribir
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.
fuente
*expande también no sea demasiado larga. : -}Ctrl+Shift+x+*Para
rmtodos, perou,pen bash solo escriba:Esto requiere que se configure la siguiente opción:
Ver más: glob - Greg's Wiki
fuente
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!niega la siguiente expresión-nameespecifica un nombre de archivo-maxdepth 1hará que find procese solo el directorio especificado (findpor defecto atraviesa directorios)-type fprocesará solo archivos (y no, por ejemplo, directorios)-deleteborrará los archivosLuego puede ajustar las condiciones mirando la página de manual de find
Actualizar
Pruebe su comando primero usando en
-printlugar de-deletefuente
-deletejusto después., será un desastre (eliminará todos los archivos en CWD)find . -maxdepth 1 -type f -name '[^up]' -deletefindes mi mejor amigo, especialmente cuando hay demasiados archivos para bloquearSencillo:
mvlos archivos que desea en un directorio superior,rmel directorio y luegomvlos devuelve.fuente
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.)
fuente
rm [^up]*? Hago cosas similares con bastante frecuencia.Haciéndolo sin encontrar:
(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.
fuente
-Eoegrepuo unpgrep -L (u|p)' * | xargs rmdonde-Lsignifica listar nombres de archivos que no contienen una coincidencia.uop, no cualquier archivo que contenga auo ap. Eso es correcto. Puede corregir mediante el usoegrep -v '^(u|p)$'ls | grep -v 'vuze\|progs' | xargs rm -rfEn zsh:
entonces
o
La segunda funcionará incluso si usted tiene
^en$histcharsla sustitución de la historia, y por supuesto se puede poner un pegote arbitraria antes de la~.fuente
GLOBIGNORE toma una lista separada por dos puntos
fuente
rmo en un directorio de prueba!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:
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.
fuente
Esto eliminará todos los archivos excepto U y P en Unix
fuente
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
uypen el directorio actual en este ejemplo. Esto puede ser útil para los scripts.fuente
-regextypesolo funcionará en versiones de GNUfindes una extensión defindcomando 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.Yo siempre uso:
Esto le permitirá definir qué tan granular desea hacer. Entonces, si desea eliminar los archivos a través de o y Z, puede usar:
fuente
Otra versión más que usa
xargs:Tenga en cuenta que
xargs -Ies necesario para manejar los nombres de archivos, incluidos los espacios correctamente.fuente
Aún otra:
Es un poco largo y no sé si podría convertirlo fácilmente en una función que pudiera acomodar fácilmente un número arbitrario de argumentos, pero funciona bien.
Y es pura bondad.
fuente
Aquí hay otra variante. Puedes escribir:
o:
Por
rmlo tanto, le pedirá que confirme la eliminación de cada archivo.fuente
Utilizar:
para eliminar todos los archivos, incluidos los directorios, excepto los archivos u, p y .ext.
fuente
Una forma simple que es difícil de arruinar: supongamos que desea eliminar todo excepto * .pdf:
fuente