GNU/Linux >> Tutoriales Linux >  >> Linux

3 formas de eliminar todos los archivos de un directorio excepto uno o algunos 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 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 rm. , buscar y globignore comandos.

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á tratar el problema que nos ocupa.

Lectura sugerida: Use el comando find para buscar múltiples nombres de archivo/extensiones en Linux

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 individual
  3. [seq] – coincide con cualquier carácter en seq
  4. [!seq] – coincide con cualquier carácter que no esté en la secuencia

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 pattern-list 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 ocurrencias 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 ocurrencias de los patrones especificados
  4. @(pattern-list) – coincide con uno de los patrones especificados
  5. !(pattern-list) – coincide con cualquier cosa excepto con uno de los patrones dados

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

# shopt -s extglob

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

$ rm -v !("filename")

2. Para eliminar todos los archivos a excepción de filename1 y nombre de archivo2 :

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

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

$ rm -i !(*.zip)

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

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

Una vez que tenga todos los comandos necesarios, apague el extglob opción de shell 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 xargs comando 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 .gz archivos en el directorio actual:

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

6. Uso de una tubería 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 .jpg archivos 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í, el GLOBIGNORE La variable almacena una lista de patrones separados por dos puntos (nombres de archivo) para ser ignorada por la expansión de la ruta.

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

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

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

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

Ahora ejecute el comando para limpiar el directorio:

$ rm -v *

Luego, apague GLOBIGNORE variables:

$ unset GLOBIGNORE

Nota :Para comprender el significado de las banderas empleadas en los comandos anteriores, consulte las páginas man de cada comando que hemos usado 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 compartir con nosotros a través de nuestra sección de comentarios a continuación.


Linux
  1. ¿Eliminar todos los archivos/directorios excepto un archivo?

  2. ¿Archivos Cat con directorio?

  3. Eliminar todos los archivos de una carpeta excepto el último (más reciente) 20?

  4. ¿Cómo eliminar todos los archivos con una extensión particular en una carpeta particular?

  5. ¿Eliminar archivos de registro antiguos excepto el último (ordenados alfanuméricamente)?

Descomprimir todos los archivos en un directorio

Elimine todos los archivos excepto los 3 más nuevos en bash script

¿Cómo eliminar todos los archivos en un directorio excepto algunos?

Eliminar todos menos 1000 archivos aleatorios en un directorio

¿Cómo cambiar el nombre de todos los archivos con caracteres especiales y espacios en un directorio?

Eliminar todas las carpetas dentro de una carpeta excepto una con un nombre específico