Interpretando expressões regulares usando find na confusão do Linux

1

Eu estou tentando usar o comando find e me deparei com um artigo no link que afirma:

The wildcard character is escaped with a slash so BASH sends a literal asterisk to the find utility as an argument instead of performing filename expansion and passing any number of files in as arguments.

para o comando find . -name up\* .

Sendo novo no mundo do Linux, não entendo muito bem como o uso de uma barra invertida que serve para escapar do meta caractere * é interpretado e retorna resultados como se fosse passado para find . Isso significa que, se eu usar a opção -name , preciso usar uma barra invertida para passar um caractere curinga e, se eu não usar -name , não preciso usar uma barra invertida? Também a barra invertida está sendo usada para que o shell bash não tente expandi-la?

    
por PeanutsMonkey 10.09.2012 / 05:33

2 respostas

1

Esteja ciente de que você está usando o termo "expressão regular" com bastante liberdade. O que você está lidando na opção find -name é bastante próximo em relação a um shell glob ... Por outro lado, a opção find -regex usa uma pesquisa de expressão regular. Você pode escolher qual estilo de regex usar através da opção -regextyp. A escolha dos tipos implementados atualmente é: emacs (este é o padrão), posix-awk, posix-basic, posix-egrep e posix-extended. ...

Como você lida com a barra invertida e o asterisco, etc. pode variar dependendo do que você deseja fazer. Se você quiser que find -name considere um asterisco como um caractere curinga, será necessário garantir que ele NÃO escape quando find realmente lê o padrão na linha de comando.

Para garantir que encontrar a obtenha em uma forma sem escape, você deve evitar que o shell (normalmente bash ) seja executado * (muito poderoso) expansão de shell no seu asterisco ... Para proteger você DEVE escapar dele no nível da linha de comando (ex .: "escape" "nos olhos da casca) .. O conceito chave neste momento é " proteger " ...

Você pode proteger seu asterisco do shell de três maneiras:

  • use ' aspas simples '
  • use " aspas duplas "
  • use as barras invertidas \ (e não )

Portanto, para find ver seu asterisco como um caractere curinga, qualquer um dos métodos de "proteção" a seguir funcionará.

  • find -name up'*'
  • find -name up"*"
  • find -name up\*
  • find -name 'up*'
  • find -name "up*"
  • find -name "up"\*

Observe que o shell nunca executa a expansão de nada em ' aspas simples ' ... " aspas duplas " são uma história diferente ..

    
por 10.09.2012 / 13:13
2

O que está faltando aqui é que o shell e o find expandem *. Você quer encontrar para expandi-lo, então você precisa escondê-lo do shell.

Você está procurando todos os arquivos fora do diretório atual cujos nomes começam com "on", certo? Se você deixar o shell expandir o *, você não conseguirá isso. Suponha que seu diretório atual contenha os arquivos "upwards" e "uplift". Então o shell muda seu comando para

find . -name upward uplift

que é uma sintaxe ruim para encontrar. Se não houver arquivos correspondentes, o shell deixará o argumento sozinho - mas é bom criar o hábito de usar comandos que funcionem corretamente, independentemente de detalhes como esse.

    
por 10.09.2012 / 06:29

Tags