Entiendo qué es la expansión de llaves , pero no sé cuál es la mejor manera de usarla.
¿Cuando lo usas?
Por favor, enséñeme algunos ejemplos convenientes y notables si tiene su propio consejo.
Entiendo qué es la expansión de llaves , pero no sé cuál es la mejor manera de usarla.
¿Cuando lo usas?
Por favor, enséñeme algunos ejemplos convenientes y notables si tiene su propio consejo.
La expansión de llaves es muy útil si tiene nombres de ruta largos. Lo 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
program -f file1 -f file2 -f file3
, puedes hacerloprogram "-f file"{1..3}
program
consigue tres palabras:"-f file1" "-f file2" "-f file3"
en vez de 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
bucle es un poco inútil, ya que puedes escribirfor ((i=1; i<=100; i++))
y es más eficiente.La expansión de llaves es muy útil al crear grandes estructuras de directorios:
Esto te dará
Incluso podría ir un paso más allá y poner la expansión de llaves en la expansión de llaves:
Esto le dará la misma estructura de directorio que el ejemplo anterior.
fuente
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) en realidad no tiene ningún propósito. Que podría haber hecho esto simplemente:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
.subdir1
ysubdir2
no en sentido literal. Reemplazarsubdir1
concat
ysubdir2
condog
por ejemplo.Lo uso cuando quiero reducir la escritura:
Otro ejemplo:
fuente
Lo uso para comparar la salida de prueba real con la salida de prueba deseada durante el desarrollo. Si la prueba # 41 falla, es fácil ver cuál es la diferencia entre el resultado de la prueba (en el archivo tests.output / 041) y el resultado deseado (en el archivo tests.out / 041):
fuente
Algunos casos frecuentes para mí son:
Para renombrar:
o
o
(Aunque es menos complicado usar el control de versiones para las últimas 2 tareas).
Para comparar (ya mencionado):
fuente
Aquí hay varias respuestas excelentes, pero ninguna de ellas menciona cuándo no usar la expansión de llaves. Al igual que los otros respondedores, utilizo bastante la expansión de llaves en la línea de comando. También lo uso en mis alias y funciones, ya que puedo esperar un shell inteligente.
Yo no lo uso en mis scripts de shell (a menos que haya alguna otra razón los scripts deben ser bash o zsh, aunque en esos casos, lo mejor es actualizar a un "verdadero" lenguaje de scripting como
perl
opython
). La expansión de llaves no es portátil ya que no está en el estándar de shell POSIX. Incluso si funciona en sus/bin/sh
- shebang shell scripts ed, no va a funcionar en sistemas con más despojados/bin/sh
conchas (por ejemplodash
).En el caso de una diferencia de un solo dígito, no necesita expansión de llaves; bastará una clase de personaje:
Bashismo
Portátil:
fuente
file{1,2}
siempre se expandirá afile1 file2
, mientras que sefile[12]
expande solo a los nombres de archivo existentes: es decir, sifile1
existe perofile2
no existe , sefile[12]
expandefile1
solo. La[]
expansión es realmente una versión restringida de?
expansión (y se llaman "expansiones de nombre de ruta").