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
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
ysubdir2
en un sentido no literal. Reemplazasubdir1
porcat
ysubdir2
pordog
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á afile1 file2
, mientras quefile[12]
solo se expandirá a nombres de archivo existentes: es decir sifile1
existe perofile2
no ‘ t,file[12]
se expande afile1
ú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.ac
… part.kb
Puedes unir esas piezas de nuevo anidando expansiones de llaves , como esta
cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip
program -f file1 -f file2 -f file3
, puedes hacerprogram "-f file"{1..3}
program
obtiene tres palabras:"-f file1" "-f file2" "-f file3"
, en lugar de 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
no tiene sentido, ya que puedes escribirfor ((i=1; i<=100; i++))
y es más eficiente.