O comando a seguir irá tar
"pontilhar" arquivos e pastas:
tar -zcvf dotfiles.tar.gz .??*
Eu estou familiarizado com expressões regulares , mas não entendo como interpretar .??*
. I executada ls .??*
e tree .??*
e olhou para os arquivos que foram listados. Por que essa expressão regular inclui todos os arquivos em pastas que começam com, .
por exemplo?
Respostas:
Globs não são expressões regulares. Em geral, o shell tentará interpretar qualquer coisa que você digitar na linha de comando que você não citar como um globo. Os shells não são necessários para suportar expressões regulares (embora, na realidade, muitos dos mais modernos e extravagantes o façam, por exemplo, o
=~
operador de correspondência de expressões regulares nabash
[[
construção).O
.??*
é um globo. Corresponde a qualquer nome de arquivo que comece com um ponto literal.
, seguido por dois caracteres (não necessariamente o mesmo)??
, seguido pela expressão regular equivalente a[^/]*
, ou seja, 0 ou mais caracteres que não são/
.Para obter detalhes completos sobre a expansão do nome do caminho do shell (o nome completo para "globbing"), consulte a especificação POSIX .
fonte
.
e com as..
quais normalmente não se deseja fazer nada. Não está certo; ele não pega nada chamado '.X
' onde X é algum caractere que não seja ponto. Eu não acho que é possível escrever um único globo que corresponda a todos os arquivos de pontos, exceto.
e..
, mas você pode fazer isso com dois:tar zcvf dotfiles.tar.gz .[!.] .??*
por exemplo.ls .?
retornou o mesmo quels ..
, o que significava que não havia outras entradas na pasta que correspondessem ao padrão.?
. Eu teria feito.[^.]
para todos os.?
arquivos que não sejam..
.[^abc]
na sintaxe regex significa o mesmo que[!abc]
na sintaxe glob (ou^
seja, substituída!
por globs). O uso da[^abc]
sintaxe de estilo em um globo não é muito portátil, porque o POSIX não especifica o que significa, portanto, alguns shells o interpretam usando semântica do tipo regex, enquanto outros tratam^
apenas como um caractere literal..[!.]
pode ser deixado como um literal natar
linha de comando no caso comum em que não há arquivos que correspondam a esse padrão. Alguns shells permitem controlar esse comportamento, por exemplo, com o bash,shopt -s nullglob
o fará desaparecer da linha de comando se não corresponder a nada, mas isso não é um recurso universal.O
.??*
curinga ( não uma expressão regular, embora pareça assim) se traduz em nomes de arquivos que começam com um ponto (.
), seguidos por dois caracteres únicos (??
) e, em seguida, qualquer número (zero ou mais) de outros caracteres (*
).Talvez esta página de caracteres curinga nos nomes de arquivos seja útil.
fonte
Para adicionar às outras respostas, um único
?
será convertido em um único nome de arquivo de caractere e??
corresponderá a nomes de arquivos que possuem apenas dois caracteres e assim por diante.fonte