Cómo utilizar Brace Expansion en Linux Bash Shell
La expansión de llaves es una técnica útil para generar listas de cadenas que se pueden usar en scripts y alias y en la línea de comandos de Linux. Ahorre tiempo y evite errores escribiendo menos.
Expansión de corsé
Antes del caparazón de Bash ejecuta un comando en una ventana de terminal o en una línea de un script, compruebe si es necesario realizar modificaciones en el comando. Los nombres de las variables se reemplazan por sus valores, los alias se reemplazan por los comandos para los que se abrevian 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á disponible en las carcasas modernas, pero puede faltar en algunas carcasas más antiguas. Si va a utilizar 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 ahorrarle tiempo y pulsaciones de teclas. A menudo, puede proporcionar una solución simple y elegante a un problema o una necesidad.
Expansiones simples
Una expansión de llaves está contenida entre un par de llaves "{}". Puede ser una lista de elementos separados por comas o un identificador de rango. No se permiten espacios entre llaves a menos que haya encerrado la cadena entre comillas ""
. "
Para una lista separada por comas, el proceso 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 del terminal. Tenga en cuenta que las comas se ignoran.
echo {one,two,three,four}
Una lista puede estar formada por palabras o números.
echo {1,2,3,4}
El orden de los elementos de la lista es completamente arbitrario.
echo (4,2,3,1)
Un rango de expansión tiene un carácter inicial y final conectado a dos puntos " ..
"Sin espacios en blanco. Todos los elementos de la lista que faltan se suministran automáticamente mediante expansión para que se cree 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é empezar con uno.
echo {3..12}
Puede especificar rangos 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 anteriormente, un intervalo tiene un comienzo y un final. personaje. No tiene por qué ser un número. Puede ser una carta.
echo {q..v}
Las letras también pueden desplazarse hacia atrás.
echo {f..a}
Usar expansión de corsé con bucles
Puede utilizar 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 permiten usar caracteres como una variable de bucle.
for i in {m..q} do echo $i done
Los bucles se utilizan generalmente en los scripts, pero nada le impide escribirlos en la línea de comandos para ver qué sucederá.
for i in {3..7}; do echo $i; done
for i in {m..q}; do echo $i; done
Concatenación y anidamiento
Dos conjuntos adyacentes no actúan de forma independiente uno tras otro. Interoperar. Cada elemento del primer conjunto se ve afectado por todos los elementos del segundo conjunto.
echo {q..v}{1..3}
Las expansiones también se pueden anidar. Una expansión anidada actuará sobre el elemento inmediatamente anterior.
echo {part-1,part-2{a,b,c,d},part-3}
También 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 incluir ese texto en los resultados de la expansión. El texto colocado delante de una expansión se denomina preámbulo, mientras que el texto colocado detrás de una expansión de llaves se denomina posdata.
Este comando usa un preámbulo.
echo chapter{1..3}
Este ejemplo usa una posdata:
echo {contents,paper,bilbiography}.md
Y este comando usa ambos.
echo chapter-{1..4}.md
Expansión de nombres de archivos y directorios
Como probablemente 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 usado echo
como una forma conveniente de ver exactamente qué sucede cuando se activa una expansión. Puede reemplazar cualquier comando que acepte nombres de archivo o directorio como entrada y usar 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 ayudar. Aquí estamos comprimiendo un subconjunto de archivos que tienen "programa" como nombre base en un archivo ZIP llamado "código fuente.zip".
Los directorios de desarrollo contienen muchos archivos que tendrán el mismo nombre base que el programa principal. Normalmente, no desea realizar copias de seguridad ni distribuir archivos como archivos de objeto ".o". Esta es una manera fácil de incluir solo los tipos de archivos de interés.
zip source-code program{.c,.h,.css}
Este comando creará una copia de un archivo y le agregará ".bak", haciendo una copia de seguridad del archivo original. Un punto interesante a tener en cuenta 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 ocurrido.
cp brace/new/prog-1.c{,.bak}
ls brace/new/prog-1.c.bak
Para realizar una acción en dos archivos en directorios diferentes, podemos usar una expansión de llaves en la ruta del archivo.
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 archivo 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 de directorio estándar que necesita crear al comienzo de un proyecto, puede crearlo rápidamente usando la expansión de llaves. La mkdir
-p
opción (padre) crea todos los directorios principales que faltan cuando se crea un directorio secundario.
mkdir -p {source,build,man,help{/pages,/yelp,/images}}
tree
Puede utilizar la expansión de corsé con wget
por descargar varios archivos.
En este comando, descargaremos archivos de dos directorios, llamados "test1" y "test2". Cada directorio contiene dos archivos llamados "image1" e "image2".
wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg
La lista de archivos muestra los archivos que se recuperaron y cómo wget
cambie el nombre de los archivos para evitar conflictos de nombres con los archivos existentes.
ls picture*.*
Abraza el corsé
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 de línea de comandos favoritos.
Pruébelo y puede encontrar su camino en su conjunto de trucos de línea de comando.
Descubre más contenido