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 :
*
– coincide con cero o más caracteres?
– coincide con cualquier carácter individual[seq]
– coincide con cualquier carácter en seq[!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:
*(pattern-list)
– coincide con cero o más ocurrencias de los patrones especificados?(pattern-list)
– coincide con cero o una aparición de los patrones especificados- +(lista-de-patrones) – coincide con una o más ocurrencias de los patrones especificados
@(pattern-list)
– coincide con uno de los patrones especificados!(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
$ rm -v !("filename")
$ rm -v !("filename1"|"filename2")
.zip
archivos de forma interactiva:
$ rm -i !(*.zip)
.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] {}
.gz
archivos en el directorio actual:
$ find . -type f -not -name '*.gz'-delete
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
.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.