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


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

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

Antes de seguir avanzando, comencemos brevemente con un concepto importante en Linux: la coincidencia de patrones de nombre de archivo, que nos permitirá abordar nuestro problema actual.

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

  1. * – matches zero or more characters
  2. ? – matches any single character
  3. [seq] – matches any character in seq
  4. [!seq] – matches any character not in seq

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

Eliminar archivos usando operadores de coincidencia de patrones extendidos

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

  1. *(pattern-list) – matches zero or more occurrences of the specified patterns
  2. ?(pattern-list) – matches zero or one occurrence of the specified patterns
  3. +(pattern-list) – matches one or more occurrences of the specified patterns
  4. @(pattern-list) – matches one of the specified patterns
  5. !(pattern-list) – matches anything except one of the given patterns

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

# shopt -s extglob

1. Para eliminar todos los archivos en un directorio, excepto el nombre de archivo, escriba el comando a continuación:

$ rm -v !("filename")

2. Para eliminar todos los archivos con la excepción de filename1 y filename2 :

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

3. El siguiente ejemplo muestra cómo eliminar todos los archivos que no sean todos los archivos .zip de manera interactiva:

$ rm -i !(*.zip)

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

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

Una vez que tenga todos los comandos necesarios, 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 de búsqueda 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 aparte de los archivos .gz en el directorio actual:

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

6. Utilizando 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 eliminará todos los archivos, excepto .gz , .odt y Archivos .jpg en el directorio actual:

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

Eliminar archivos usando Bash GLOBIGNORE Variable

Este último enfoque sin embargo, solo funciona con bash. Aquí, la variable GLOBIGNORE almacena una lista de patrones separados por dos puntos (nombres de archivo) que se ignorará por la expansión de la ruta de acceso.

Para emplear este método, vaya 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, desactiva la variable GLOBIGNORE :

$ unset GLOBIGNORE

rojo

¡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.