Cómo utilizar Brace Expansion en Bash Shell de Linux

Contenidos

Una ventana de terminal en un sistema Linux.

La expansión de llaves es una técnica útil para generar listas de cadenas que se pueden utilizar en scripts y alias y en la línea de comandos de Linux. Ahorre tiempo y evite errores escribiendo menos.

Expansión de la abrazadera

Antes del caparazón de Bash ejecuta un comando en una ventana de terminal o una línea en un script, verifica si necesita realizar alguna sustitución en el comando. Los nombres de las variables se reemplazan por sus valores, los alias se reemplazan por los comandos para los que son abreviados y se realiza cualquier expansión. La expansión de llaves es una forma de expansión respaldada por Bash.

La expansión de abrazadera está habilitada en las carcasas modernas, pero es factible que falte en algunas carcasas antiguas. Si va a usar la expansión de llaves en los scripts, asegúrese de invocar un shell que admita la expansión de llaves, como Bash:

Usaremos Bash para nuestros ejemplos.

La generación de listas de cadenas puede parecer más una novedad que un beneficio, pero ofrece algunas funciones que pueden ahorrar tiempo y pulsaciones de teclas. A menudo, puede proporcionar una solución simple y elegante a un obstáculo o requisito.

Expansiones simples

Una expansión de llaves está contenida entre un par de llaves «{}». Puede ser una lista de ítems separados por comas o un especificador de rango. No se posibilitan espacios dentro de las llaves a menos que haya envuelto la cadena entre comillas «". «

Para una lista separada por comas, el procedimiento de expansión toma cada elemento por turno y lo pasa al comando de llamada. En este ejemplo, es echo que simplemente los imprime en la ventana de la terminal. Tenga en cuenta que las comas se ignoran.

echo {one,two,three,four}

Una lista puede estar formada por palabras o dígitos.

echo {1,2,3,4}

El orden de los ítems de la lista es absolutamente arbitrario.

echo (4,2,3,1)

Un rango de expansión tiene un carácter inicial y final conectado con dos puntos » .. ”Sin ningún espacio en blanco. La expansión proporciona automáticamente todos los ítems de la lista que faltan, de modo que se crea todo el rango desde el carácter inicial hasta el final.

Esto imprimirá los dígitos del 1 al 10.

echo {1..10}

La numeración es arbitraria. No tiene por qué comenzar en uno.

echo {3..12}

Los rangos se pueden especificar para que se ejecuten hacia atrás. Esto generará una lista de cinco a uno.

echo {5..1}

Los rangos pueden incluir números negativos.

echo {4..-4}

Como señalamos previamente, un rango tiene un comienzo y un final personaje. No tiene por qué ser un número. Puede ser una carta.

echo {q..v}

Las letras además pueden ir al revés.

echo {f..a}

Uso de la expansión de corsé con bucles

Puede usar la expansión de llaves con rangos en bucles en scripts.

for i in {3..7}
do
   echo $i
done

Los rangos de expansión de llaves le posibilitan utilizar caracteres como variable de bucle.

for i in {m..q}
do
   echo $i
done

Los bucles de forma general se usan en scripts, pero no hay nada que le impida escribirlos en la línea de comando para ver qué sucede.

for i in {3..7}; do echo $i; done

for i in {m..q}; do echo $i; done

Concatenación y anidación

Dos expansiones adyacentes no actúan de forma independiente una tras otra. Interoperan. Cada elemento en la primera expansión es actuado por cada elemento en la segunda expansión.

echo {q..v}{1..3}

Las expansiones además se pueden anidar. Una expansión anidada actuará sobre el elemento inmediatamente anterior.

echo {part-1,part-2{a,b,c,d},part-3}

Además puede anidar expansiones creando una lista delimitada por comas de expansiones de rango.

echo {{5..0},{1..5}}

Preámbulo y posdata

Puede colocar texto antes y después de una expansión de llaves para que ese texto se incluya en los resultados de la expansión. El texto colocado delante de una expansión se llama preámbulo, mientras que el texto colocado detrás de una expansión de llaves se llama posdata.

Este comando utiliza un preámbulo.

echo chapter{1..3}

Este ejemplo utiliza una posdata:

echo {contents,paper,bilbiography}.md

Y este comando utiliza ambos.

echo chapter-{1..4}.md

Ampliación de directorios y nombres de archivos

Como probablemente ya habrá adivinado, uno de los usos principales de las expansiones de llaves es crear nombres de archivos y directorios que se pueden pasar a otros comandos. Hemos estado usando echo como una forma conveniente de ver exactamente qué sucede cuando se activa una expansión. Puede sustituir cualquier comando que tome nombres de archivos o directorios como entrada y utilizar la expansión de llaves con él.

Para crear rápidamente algunos archivos, use touch:

touch file-{1..4}.txt
ls *.txt

Si tiene muchos archivos con el mismo nombre base pero diferentes extensiones de archivo y desea realizar una operación en un subconjunto de ellos, las expansiones de llaves pueden contribuir. Aquí, estamos comprimiendo un subconjunto de archivos que disponen «programa» como nombre de base en un archivo ZIP llamado «código-fuente.zip».

Los directorios de desarrollo contienen muchos archivos que tendrán el mismo nombre de base que su programa principal. Por lo general, no desea realizar copias de seguridad ni repartir archivos como archivos de objeto «.o». Esta es una forma simple de incluir solo los tipos de archivos de interés.

zip source-code program{.c,.h,.css}

Este comando hará una copia de un archivo y le agregará «.bak», haciendo una copia de seguridad del archivo original. Un punto interesante a prestar atención es que la expansión de llaves contiene una lista separada por comas, pero el primer elemento está vacío. Si no hubiéramos incluido la coma, la expansión no habría tenido lugar.

cp brace/new/prog-1.c{,.bak}
ls brace/new/prog-1.c.bak

Para realizar alguna acción en dos archivos en directorios diferentes, podemos utilizar una expansión de llaves en la ruta a los archivos.

En este ejemplo, el directorio «brace» contiene dos subdirectorios, uno llamado «nuevo» y otro llamado «antiguo». Contienen diferentes versiones del mismo conjunto de archivos de código fuente. Usaremos el diff programa para ver las diferencias entre las dos versiones de «prog-1.c.»

diff brace/{new,old}/prog-1.c

Si tiene un esqueleto estándar de directorios que necesita crear al comienzo de un proyecto, puede crearlos rápidamente usando la expansión de llaves. los mkdir -p opción (padre) crea los directorios principales que faltan cuando se crea un directorio secundario.

mkdir -p {source,build,man,help{/pages,/yelp,/images}}
tree

Puede usar la expansión de corsé con wget para descargar varios archivos.

En este comando, vamos a descargar archivos de dos directorios, llamados «test1» y «test2». Cada directorio contiene dos archivos llamados «imagen1» e «imagen2».

wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg

Enumerar los archivos muestra los archivos que se recuperaron y cómo wget cambia el nombre de los archivos para evitar conflictos de nombres con los archivos existentes.

ls picture*.*

Abraza la abrazadera

Parece que la expansión de llaves es otro de los secretos mejor guardados de Linux. Mucha gente me dice que nunca ha oído hablar de la expansión de llaves, mientras que otros me informan que es uno de sus trucos favoritos de línea de comandos.

Pruébelo y podría hallar su camino en su conjunto de trucos de línea de comandos.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.