Cómo eliminar todos los ficheros de un directorio menos uno

eliminar ficheros Linux

A veces necesitas eliminar casi todos los ficheros de un directorio, pero quieres conservar uno o algunos de ellos. Cuando hay gran cantidad de ellos, ir uno a uno es una tarea tediosa. No es la mejor opción, hay formas de poder hacer mucho más sencillo el trabajo en Linux y que puedas eliminar todos los que necesitas de una vez.

Por ejemplo, es probable que quieras eliminar solo los que comienzan por un nombre determinado, o los que tienen una extensión específica, etc. Todo eso es posible, de hecho, en otras ocasiones ya he mostrado tutoriales similares en LxA. Aquí podrás seguir el tutorial paso a paso y de forma simple para poder eliminar todos esos ficheros que quieres, excepto lo que quieres salvar.

Y lo mejor es que no necesitarás instalar ningún programa, se puede hacer fácilmente con comandos como rm y find. Es decir, programas que ya vienen preinstalados en cualquier distro Linux. Y por supuesto, el método se basará en la búsqueda de patrones y usar esas coincidencias para eliminar solo aquello que quieres.

Pues bien, para poder eliminar hay varias alternativas, que son…

Eliminar ficheros de un directorio con rm

Bien, para poder usar el comando rm para eliminar lo que te apetece, tienes que conocer antes algunas formas de identificar patrones:

  • *(lista de patrones) – coincide con cero o más ocurrencias de los patrones especificados
  • ?(lista de patrones) – coincide con cero o una ocurrencia de los patrones especificados
  • +(lista de patrones) – coincide con una o más ocurrencias de los patrones especificados
  • @(lista de patrones) – coincide con uno de los patrones especificados
  • !(lista de patrones) – coincide con cualquier cosa excepto con uno de los patrones dados

Para activar extglob para poderlos usar, tienes que ejecutar primero el siguiente comando:

<br data-mce-bogus="1">

shopt -s extglob<br data-mce-bogus="1">

 

 

¡Ojo! No lo especifico, pero se supone que tienes permisos para hacer dichas operaciones, y que estás dentro de ese directorio cuando ejecutas el comando rm. Cuidado con esto, ya que si lo ejecutas en otra ruta, puede que termines eliminando ficheros que no deseas. Es decir, antes de ejecutar estos comandos, asegúrate de que has entrado en el directorio que quieres con cd.

Ahora ya puedes usar rm para eliminar lo que te apetezca. Por ejemplo, eliminar todos los ficheros de un directorio excepto los que coincidan con el nombre «lxa»:


rm -v !("lxa")

También puedes especificar dos o más nombres que no quieres eliminar. Por ejemplo, para evitar eliminar «lxa» y «desdelinux»:

 rm -v !("lxa"|"desdelinux") 

Puedes eliminar todos los ficheros, menos los que tienen extensión .mp3. Por ejemplo:

 rm -v !(*.mp3) 

Al finalizar, puedes volver a deshabilitar extglob:

 shopt -u extglob 

Eliminar ficheros de un directorio con find

Otra alternativa a rm es usar find para eliminar lo que te apetece. Puedes usar una pipe y xargs con rm, o usar la opción -delete de find. Es decir, la sintaxis genérica sería:

find /directory/ -type f -not -name 'PATRÓN' -delete
find /directory/ -type f -not -name 'PATRÓN' -print0 | xargs -0 -I {} rm [opciones] {}

Por ejemplo, imagina que quieres eliminar todos los ficheros de un directorio menos los que tienen extensión .jpg, podrías usar uno de estos dos comandos, ya que ambos obtienen el mismo resultado:


find . -type f -not -name '*.jpg'-delete

find . -type f -not -name '*.jpg' -print0 | xargs -0 -I {} rm -v {}

En cambio, si quisieras agregar algún patrón extra, también podrías. Por ejemplo, imagina que no deseas eliminar ni los .pdf ni los .odt de un directorio:


find . -type f -not \(-name '*pdf' -or -name '*odt' \) -delete

Por supuesto, lo mismo podrías hacer con | y xargs como en el ejemplo anterior. Por cierto, hemos usado -not para negar, pero puedes eliminar eso para hacerlo positivo, es decir, para eliminar los patrones que coinciden y no excluirlos.

Eliminar ficheros de un directorio usando la variable GLOBIGNORE

Por último, existe otra alternativa a find y rm, y es usando una variable de entorno para señalar a los ficheros que deseas eliminar o excluir. Por ejemplo, imagina que deseas eliminar todos los ficheros de un directorio llamado Descargas salvando los .pdf, .mp3 y .mp4. En ese caso, podrías hacer lo siguiente:


cd Descargas
GLOBIGNORE=*.pdf:*.mp4:.*mp3
rm -v *
unset GLOBIGNORE


El contenido del artículo se adhiere a nuestros principios de ética editorial. Para notificar un error pincha aquí.

Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.