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.
Respuestas:
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
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 escribir for ((i=1; i<=100; i++))
y es más eficiente.
La expansión de llaves es muy útil al crear grandes estructuras de directorios:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Esto te 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 la expansión de llaves:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Esto le dará la misma estructura de directorio que el ejemplo anterior.
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
y subdir2
no en sentido literal. Reemplazar subdir1
con cat
y subdir2
con dog
por ejemplo.
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):
$ diff tests.{out,output}/041
Algunos casos frecuentes para mí son:
Para renombrar:
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
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
o python
). 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 ejemplo dash
).
En el caso de una diferencia de un solo dígito, no necesita expansión de llaves; bastará una clase de personaje:
Bashismo
diff file{1,2}
Portátil:
diff file[12]
file{1,2}
siempre se expandirá a file1 file2
, mientras que se file[12]
expande solo a los nombres de archivo existentes: es decir, si file1
existe pero file2
no existe , se file[12]
expande file1
solo. La []
expansión es realmente una versión restringida de ?
expansión (y se llaman "expansiones de nombre de ruta").
program -f file1 -f file2 -f file3
, puedes hacerloprogram "-f file"{1..3}