Confusão de pontos literais, copie todos os arquivos ocultos

1

Funciona bem quando copio todos os arquivos ocultos usando regex:

cp -r source/\.[^.]* destination/

e apenas copia exatamente os arquivos que começam com um ponto . .

No entanto, também encontrei os seguintes trabalhos:

cp -r source/.[^.]* destination/

Na expressão regular, o ponto . não significa "qualquer caractere singular"? Então, por que o segundo comando não copia arquivos regulares (aqueles que não estão ocultos)?
Por que o ponto . é interpretado literalmente no comando cp ?

    
por LYg 31.07.2012 / 20:43

2 respostas

7

cp , assim como o restante dos comandos internos do shell, aceitam e expandem glob patters e não expressões regulares. Eles são semelhantes em alguns aspectos, diferentes em muitos. Por exemplo, o . é literal em globs e qualquer caractere único é correspondido com ? .

Seu amigo, neste caso, é man 7 glob .

    
por Marios Zindilis 31.07.2012 / 21:05
1

O Bash não usa expressões regulares, ele usa suas próprias regras para expansão de curinga (chamada de "globbing". O ponto é simplesmente um caractere, e o caractere '^' nega o que segue. então o primeiro exemplo combina arquivos começando com um ponto, não seguido por um segundo ponto, e o próximo faz o mesmo; não há necessidade de escapar do ponto, mas ele é aceito de qualquer maneira.

Edit: Depois de olhar para o sugerido "man 7 glob" por Marios, eu estava enganado, penso eu, sobre o personagem '^'. Parece dizer que [^.] seria indefinido em vez de não caractere. Bash usa um ponto de exclamação para negação.

    
por Marty Fried 31.07.2012 / 21:11