El siguiente comando tar
"archivará" todos los archivos y carpetas:
tar -zcvf dotfiles.tar.gz .??*
Estoy familiarizado con las expresiones regulares , pero no entiendo cómo interpretar .??*
. Ejecuté ls .??*
y tree .??*
miré los archivos que estaban en la lista. ¿Por qué esta expresión regular incluye todos los archivos dentro de carpetas que comienzan .
por ejemplo?
Respuestas:
Los globos no son expresiones regulares. En general, el shell intentará interpretar cualquier cosa que escriba en la línea de comando que no cita como un globo. No es necesario que los shells admitan expresiones regulares (aunque en realidad muchos de los más modernos y sofisticados sí lo hacen, por ejemplo, el
=~
operador de coincidencia de expresiones regulares en labash
[[
construcción).El
.??*
es un pegote. Coincide con cualquier nombre de archivo que comience con un punto literal.
, seguido de dos caracteres (no necesariamente el mismo)??
, seguido del equivalente de expresión regular de[^/]*
, es decir, 0 o más caracteres que no lo son/
.Para conocer todos los detalles de la expansión del nombre de ruta del shell (el nombre completo de "globbing"), consulte la especificación POSIX .
fuente
.
y con el..
que normalmente no se quiere hacer nada. No está del todo bien; no recoge nada llamado '.X
' donde X es un personaje que no sea punto. No creo que sea posible escribir un solo globo que coincida con cada archivo de puntos excepto.
y..
, pero puede hacerlo con dos:tar zcvf dotfiles.tar.gz .[!.] .??*
por ejemplo.ls .?
devolvió lo mismo quels ..
, lo que significa que no había otras entradas en la carpeta que coincidan con el patrón.?
. Lo hubiera hecho.[^.]
para todos los.?
archivos que no sean..
.[^abc]
en la sintaxis regex significa lo mismo que[!abc]
en la sintaxis glob (^
es decir, se reemplaza!
por globs). El uso de la[^abc]
sintaxis de estilo en un globo no es muy portátil porque POSIX no especifica lo que significa, por lo que algunos shells lo interpretan utilizando una semántica similar a la expresión regular, mientras que otros lo tratan^
como un carácter literal..[!.]
puede dejarse como un literal en latar
línea de comando en el caso común donde no hay archivos que coincidan con ese patrón. Algunos shells le permiten controlar ese comportamiento, por ejemplo, con bash,shopt -s nullglob
lo hará desaparecer de la línea de comando si no coincide con nada, pero esa no es una característica universal.El
.??*
comodín ( no es una expresión regular, aunque se ve de esa manera) se traduce en nombres de archivo que comienzan con un punto (.
), seguidos de dos caracteres individuales (??
) y luego cualquier número (cero o más) de otros caracteres (*
).Tal vez esta página sobre comodines en nombres de archivo sea útil.
fuente
Para agregar a las otras respuestas, un solo
?
se traducirá a un nombre de archivo de un solo carácter y??
coincidirá con los nombres de archivo que solo tienen dos caracteres, etc.fuente