¿Cuándo se usa la expansión del corsé?

Entiendo qué es la expansión de llaves , pero no sé cuál es la mejor manera de hacerlo úselo.

¿Cuándo lo usa?
Por favor, enséñeme algunos ejemplos prácticos y notables si tiene su propio consejo.

Respuesta

La expansión de llaves es muy útil si tiene nombres de ruta largos. La uso como una forma rápida de hacer una copia de seguridad de un archivo :

cp /a/really/long/path/to/some/file.txt{,.bak} 

copiará /a/really/long/path/to/some/file.txt a /a/really/long/path/to/some/file.txt.bak

También puedes usarlo en una secuencia . Una vez lo hice para descargar muchas páginas de la web:

wget http://domain.com/book/page{1..5}.html 

o

for i in {1..100} do #do something 100 times done 

Comentarios

  • Esto también se puede usar para la duplicación de argumentos. Supongamos que tiene algún programa que requiere un ‘ -f ‘ argumento para cada archivo para operar. en lugar de hacer program -f file1 -f file2 -f file3, puedes hacer program "-f file"{1..3}
  • Esto es una pena. Lo acabo de descubrir, pero hago la copia de seguridad en rutas extralargas durante años sin saberlo. Gracias.
  • @Patrick: Eso falla porque program obtiene tres palabras: "-f file1" "-f file2" "-f file3", en lugar de 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Usar la expansión para usar en un bucle for no tiene sentido, ya que puedes escribir for ((i=1; i<=100; i++)) y es más eficiente.

Respuesta

Expansión de llaves resulta muy útil cuando se crean estructuras de directorios grandes:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2} 

Esto le dará

find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2 

Incluso podría ir un paso más allá y poner la expansión de llaves en expansión de llaves:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}} 

Esto le dará la misma estructura de directorio que en el ejemplo anterior.

Comentarios

  • El anidamiento es bueno, pero su ejemplo de anidamiento (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) no ‘ no sirven para nada. Podrías haber hecho esto: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, tiene un propósito si interpretas subdir1 y subdir2 en un sentido no literal. Reemplaza subdir1 por cat y subdir2 por dog por ejemplo.
  • @ephsmith: si interpreta » subdir1 » como sustituto de » cat » y » subdir2 » para » dog «, el ejemplo de anidamiento falla, ya que usa el subdirectorio {1,2}, y no hay una cadena que pueda reemplazar » subdir » con eso hará que el subdirector {1,2} return {cat, dog}.

Respuesta

Lo uso cuando quiero reducir la escritura:

geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2} 

Otro ejemplo:

wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev 

Respuesta

Lo uso para comparar prueba de salida a la salida de prueba deseada durante el desarrollo. Si la prueba # 41 falla, es fácil ver cuál es la diferencia entre la salida de la prueba (en el archivo tests.output / 041) y la salida deseada (en el archivo tests.out / 041):

$ diff tests.{out,output}/041 

Respuesta

Algunos casos frecuentes para mí son:

Para cambiar el nombre:

mv myText.{txt,tex} 

o

mv myText.tex{,.old} 

o

cp myText.tex{,.backup} 

(Aunque es menos complicado usar el control de versiones para las últimas 2 tareas).

Para comparar (ya mencionado):

diff path{1,2}/a.txt 

Respuesta

Aquí hay varias respuestas excelentes, pero ninguna menciona cuando no para usar la expansión de llaves. Al igual que los otros respondedores, utilizo bastante la expansión de llaves en la línea de comandos. También lo uso en mis alias y funciones, ya que puedo esperar un shell inteligente.

No no lo uso en mis scripts de shell (a menos que haya «alguna otra razón por la que los scripts debe ser bash o zsh, aunque en esos casos, es mejor actualizar a un lenguaje de secuencias de comandos «real» como perl o python ). La expansión de llaves es no portátil porque no está en el estándar de shell POSIX. Incluso si funciona en sus scripts de shell /bin/sh shebang ed, no funcionará en sistemas con más /bin/sh shells (por ejemplo, dash).

En el caso de una diferencia de un solo dígito, no necesita expansión de llaves; una clase de carácter será suficiente:

Bashismo:

diff file{1,2} 

Portátil:

diff file[12] 

Comentarios

  • Una diferencia es que file{1,2} siempre se expandirá a file1 file2, mientras que file[12] solo se expandirá a nombres de archivo existentes: es decir si file1 existe pero file2 no ‘ t, file[12] se expande a file1 únicamente. La expansión [] es en realidad una versión restringida de ? expansión (y se llaman » expansiones de nombre de ruta «).
  • Correcto, la expansión de llaves no es shell globbing (también conocido como expansión de nombre de ruta). Esa ‘ es una buena llamada que no

    No se ha mencionado todavía: la expansión de llaves es mejor para notar rutas inesperadamente ausentes. También puede hacer una expansión global de llaves.

Responder

Después de dividir un archivo muy grande con

split -b 100m hugeFile.zip part. 

Supongamos que se divide en 262 partes, en otras palabras part.aa, part.ab, part.acpart.kb

Puedes unir esas piezas de nuevo anidando expansiones de llaves , como esta

cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *