3 formas de eliminar todos los archivos de un directorio, excepto uno o pocos archivos con extensiones


A veces, se encuentra en una situación en la que necesita eliminar todos los archivos en un directorio o simplemente limpiar un directorio eliminando todos los archivos excepto los archivos de un tipo determinado (que terminan con una extensión en particular).

En este artículo, le mostraremos cómo eliminar archivos en un directorio, excepto ciertas extensiones o tipos de archivos mediante los comandos rm, find y globignore.

Antes de seguir adelante, comencemos por echar un vistazo breve a un concepto importante en Linux: la coincidencia de patrones de nombre de archivo, que nos permitirá abordar nuestro problema en cuestión.

En Linux, un patrón de shell es una cadena que consta de los siguientes caracteres especiales, que se denominan comodines o metacaracteres:

  1. * : coincide con cero o más caracteres
  2. ? : coincide con cualquier carácter
  3. [seq] : coincide con cualquier carácter en seq
  4. [! seq] : coincide con cualquier carácter que no esté en seq

Hay tres métodos posibles que exploraremos aquí, y estos incluyen:

Eliminar archivos mediante operadores de coincidencia de patrones extendidos

Los diferentes operadores de coincidencia de patrones extendidos se enumeran a continuación, donde la lista de patrones es una lista que contiene uno o más nombres de archivo, separados mediante el carácter | :

  1. * (lista de patrones) : coincide con cero o más ocurrencias de los patrones especificados
  2. ? (lista de patrones) : coincide con cero o una aparición de los patrones especificados
  3. + (lista de patrones): coincide con una o más ocurrencias de los patrones especificados
  4. @ (lista de patrones) : coincide con uno de los patrones especificados
  5. ! (lista de patrones) - coincide con cualquier cosa excepto uno de los patrones dados

Para usarlos, habilite la opción de shell extglob de la siguiente manera:

# shopt -s extglob

1. Para eliminar todos los archivos de un directorio excepto el nombre del archivo, escriba el siguiente comando:

$ rm -v !("filename")

2. Para eliminar todos los archivos excepto el nombre de archivo1 y el nombre de archivo2:

$ rm -v !("filename1"|"filename2") 

3. El siguiente ejemplo muestra cómo eliminar todos los archivos excepto todos los archivos .zip de forma interactiva:

$ rm -i !(*.zip)

4. A continuación, puede eliminar todos los archivos de un directorio, excepto todos los archivos .zip y .odt de la siguiente manera, mientras muestra lo que se está haciendo:

$ rm -v !(*.zip|*.odt)

Una vez que tenga todos los comandos requeridos, desactive la opción de shell extglob así:

$ shopt -u extglob

Eliminar archivos usando el comando find de Linux

Bajo este método, podemos usar el comando find exclusivamente con las opciones apropiadas o junto con el comando xargs empleando una canalización como en los formularios a continuación:

$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. El siguiente comando eliminará todos los archivos excepto los archivos .gz en el directorio actual:

$ find . -type f -not -name '*.gz'-delete

6. Con una canalización y xargs, puede modificar el caso anterior de la siguiente manera:

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

7. Veamos un ejemplo adicional, el siguiente comando borrará todos los archivos excepto los archivos .gz , .odt y .jpg en el directorio actual:

$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Eliminar archivos usando la variable Bash GLOBIGNORE

Sin embargo, este último enfoque solo funciona con bash. Aquí, la variable GLOBIGNORE almacena una lista de patrones (nombres de archivo) separados por dos puntos para ser ignorados por la expansión del nombre de la ruta.

Para emplear este método, muévase al directorio que desea limpiar, luego configure la variable GLOBIGNORE de la siguiente manera:

$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt

En este caso, todos los archivos que no sean .odt , .iso y .txt se eliminarán del directorio actual.

Ahora ejecute el comando para limpiar el directorio:

$ rm -v *

Luego, apague la variable GLOBIGNORE:

$ unset GLOBIGNORE

Nota: Para comprender el significado de los indicadores empleados en los comandos anteriores, consulte las páginas de manual de cada comando que hemos usado en las distintas ilustraciones.

¡Eso es todo! Si tiene otras técnicas de línea de comando en mente para el mismo propósito, no olvide compartir con nosotros a través de nuestra sección de comentarios a continuación.