Búsqueda de sitios web

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


A veces te encuentras en una situación en la que necesitas 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 ciertas extensiones o tipos de archivos, usando los comandos rm, find y globignore.

Antes de continuar, comencemos echando un vistazo breve a un concepto importante en Linux: la coincidencia de patrones de nombres de archivos, que nos permitirá resolver el problema que nos ocupa.

Lectura sugerida: Utilice el comando buscar para buscar varios nombres de archivos/extensiones en Linux

En Linux, un patrón de shell es una cadena que consta de los siguientes caracteres especiales, a los que se hace referencia como 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 secuencia

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 lista-patrones es una lista que contiene uno o más nombres de archivos, separados mediante el carácter |:

  1. *(pattern-list): coincide con cero o más apariciones de los patrones especificados
  2. ?(pattern-list): coincide con cero o una aparición de los patrones especificados
  3. +(lista de patrones): coincide con una o más apariciones de los patrones especificados
  4. @(pattern-list) – coincide con uno de los patrones especificados
  5. !(pattern-list) – 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 en un directorio excepto el nombre del archivo, escriba el siguiente comando:

rm -v !("filename")

2. Para eliminar todos los archivos con excepción de nombre de archivo1 y nombre de archivo2:

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

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

rm -i !(*.zip)

4. A continuación, puede eliminar todos los archivos de un directorio aparte 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 de esta manera:

shopt -u extglob

Eliminar archivos usando el comando de búsqueda de Linux

Con este método, podemos usar el comando buscar exclusivamente con las opciones apropiadas o junto con el comando xargs empleando una canalización como se muestra 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. Usando una pipeline 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 .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 la variable Bash GLOBIGNORE

Sin embargo, este último enfoque sólo funciona con bash. Aquí, la variable GLOBIGNORE almacena una lista de patrones (nombres de archivos) separados por dos puntos que se ignorarán mediante la expansión del nombre de ruta.

Lectura sugerida: 12 ejemplos prácticos útiles sobre el comando Grep en Linux

Para emplear este método, vaya al directorio que desea limpiar y 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, desactive 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 utilizado en las distintas ilustraciones.

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