Creé tres archivos en mi directorio usando el comando touch inv{1..3}.txt
. Ahora usé dos comandos y su salida es más o menos la misma. Esos dos comandos son ls inv[13].txt
y ls {1,3}.txt
.
Entonces, ¿cómo son estos dos diferentes? ¿En qué se diferencian los corchetes en comparación con los brackets? También busqué en Google "Linux [..]", pero no pude encontrar nada, ¿podría saber cómo se llaman estas cosas en la terminología de Linux?
Gracias
command-line
bash
scripts
posixKing
fuente
fuente
{}
y Expansión de nombre de archivo> Coincidencia de patrones para[]
.Respuestas:
{}
se llama expansión de llaves. Tiene dos formas:{x..y}
y{x,y}
, reemplazarx
yy
con cualquier valor alfabético o numérico.En la primera forma,
{x..y}
se ampliará a todos los valores desdex
hastay
, inclusive. Por ejemplo,{2..5}
se ampliará a2
,3
,4
,5
.En la segunda forma explícita,
{x,y}
se ampliará para solamentex
,y
. Por ejemplo,{2,5}
se expandirá a2
y5
.Si no es posible la expansión, el patrón se trata literalmente, por ejemplo, en
{a..3}
.Lo importante a tener en cuenta es que la expansión de llaves se realizará (si es posible) independientemente de la coincidencia de cualquier archivo, mientras esté en la creación / coincidencia de archivos.
[]
se conoce como un patrón de expansión de nombre de ruta (o globbing). A diferencia de la expansión de llaves, solo puede usarla mientras coincide con los nombres de archivo, se tratará literalmente si la usa mientras crea archivos.Tiene dos formas:
[xyz...]
y[x-y]
.En la primera forma, coincidirá con cualquier carácter individual dentro de los corchetes por separado, es decir, cada carácter se trata individualmente. Entonces, para
[25].txt
que coincida con un archivo llamado2.txt
o5.txt
en el directorio actual, mientras que para[245].txt
que coincida con cualquier archivo llamado2.txt
o4.txt
o5.txt
.En la segunda forma, una expansión de rango se realiza primero antes de hacer coincidir individualmente, si es posible, de lo contrario se tratará literalmente. Entonces
[2-5]. txt
, coincidirá con cualquier archivo llamado2.txt
or3.txt
o4.txt
or5.txt
. Si el rango no se puede ampliar, se tratará literalmente, por ejemplo, en caso de[a-3].txt
.Una diferencia de comportamiento importante entre estos dos es cuando hay más patrones para igualar mientras menos coincide realmente. Como la expansión de llaves se realiza sin importar qué, mostrará un error de que ciertos archivos no existen, mientras que la expansión de la ruta de acceso coincidirá con lo posible sin ningún error para el resto:
Nota de portabilidad:
El
[]
operador de expansión ruta de acceso se define por POSIX por lo tanto portátil entre Bourne shell y derivados.{}
POSIX no define la expansión de llaves, por lo tanto, no es portátil entre todos los shells. Por ejemplo,dash
(sh
en Ubuntu) no tiene esto. Fue tomado decsh
y trabajará en ciertas conchas única por ejemplobash
,zsh
,ksh93
,fish
. Asegúrese de que el shell que está utilizando lo admite antes de implementarlo.Ejemplo:
fuente
[
]
expansión cuando no hay coincidencias porque eso puede ser diferente dependiendo de la configuración del shell. Si desea usar[
o]
en un nombre de archivo, debe citarse en sus comandos. También vale la pena notar la diferencia entre{13..79}
y[13-79]
. El primer producirá todos los números en el rango de13
a79
, la segunda coincidirá con los personajes1
,3
,4
,5
,6
,7
, y9
.nullglob
(o similar). Sobre la[13-79]
coincidencia, creo que mencioné claramente en mi respuesta sobre el comportamiento por carácter de [] `.ksh
tiene esta característica, pero no son sabores más modernos, como mksh y pkdshLa diferencia clave entre las dos formas se ilustra aquí:
inv[15].txt
es un globo y expandirá la lista de archivos coincidentes en su sistema de archivos. Esta es la expansión del nombre de ruta .inv{1,5}.txt
se expandeinv1.txt
einv5.txt
independientemente de qué archivos están realmente en su sistema de archivos. Esta es la expansión de llaves .fuente
ba{con,tman}
y no hay equivalente usando corchetes. IOW, la expansión de llaves no es solo para caracteres individuales.