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?
123
shopt -s dotglob
antes 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
rm
todos, perou,p
en 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-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
!
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
fuente
-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 bloquearSencillo:
mv
los archivos que desea en un directorio superior,rm
el directorio y luegomv
los devuelve.fuente
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.)
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
-E
oegrep
u
o unp
grep -L (u|p)' * | xargs rm
donde-L
significa listar nombres de archivos que no contienen una coincidencia.u
op
, no cualquier archivo que contenga au
o ap
. Eso es correcto. Puede corregir mediante el usoegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
En zsh:
entonces
o
La segunda funcionará incluso si usted tiene
^
en$histchars
la 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
rm
o 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
u
yp
en el directorio actual en este ejemplo. Esto puede ser útil para los scripts.fuente
-regextype
solo funcionará en versiones de GNUfind
es una extensión defind
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.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 -I
es 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
rm
lo 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