Qual é a diferença entre [.] * e '. *' para o comando 'find -name'?

6

Meu objetivo é encontrar todos os arquivos ou diretórios em um sistema de arquivos que inicie com um ponto ( . ), por exemplo, .gnupg . Então eu inventei o comando:

find -name '.*'

Verificando na Internet, eu vi algumas dicas dizendo que eu deveria usar [.]* como o valor do parâmetro para a opção -name . Qual é a diferença entre as duas abordagens, já que o resultado parece o mesmo?

    
por Davi Garcia 23.10.2013 / 21:36

3 respostas

6

Não há diferença alguma. Se você tentar:

$ diff <(find -name '.*') <(find -name '[.]*')

você não recebe saída. Isso significa que as saídas de comando são idênticas. Eu acho que você está tirando essa "dica" do contexto. A intenção foi provavelmente algo diferente.

Na página find man:

-name pattern
Base of file name (the path with the leading directories removed) matches shell pattern pattern. The metacharacters (*',?', and []') match a.' at the start of the base name (this is a change in findutils-4.2.2)

significa que [] no argumento -name é interpretado como uma classe de caracteres. Com nada além de . , corresponde a um literal . como se você não usasse o [] .

    
por 23.10.2013 / 21:40
0

Para um padrão glob, não há diferença. .* é um período literal seguido por zero ou mais caracteres. [.]* é qualquer caractere dentro dos colchetes - nesse caso, tem que ser um período literal - seguido por zero ou mais caracteres.

As expressões regulares semelhantes .* e [.]* são diferentes. A primeira é zero ou mais ocorrências de qualquer caractere único, enquanto a segunda é zero ou mais ocorrências de um período literal. O . é um metacaractere de expressão regular, mas não dentro de colchetes, onde é tratado literalmente.

    
por 25.10.2013 / 01:16
-1

Que tal

'\.[a-z]*'

A expressão espera um ponto literal seguido por qualquer quantidade de caracteres alfabéticos. Pareceu trabalhar para mim em um teste rápido. Você precisa da barra invertida para escapar do ponto. Geralmente é um meta-caractere significando "qualquer personagem" (mais ou menos).

Toda minha expressão foi

find ~/ -name '\.[a-z]*'

Editar: para incluir arquivos de ponto que começam com números, tente '\.[a-z0-9]*' . Não tenho certeza porque você não pode apenas dizer '\.(.*)' , mas tenho certeza que alguém tem uma sugestão.

    
por 23.10.2013 / 22:28

Tags