O que essa linha de Bash deveria significar?

1
find . -name "*.html" -exec grep -l somethingtobefound {} \;

Eu estava pensando quais seriam as palavras-chave "-name" "-exec" "-l" "{}" "\" e ";" deveria significar.

Além disso, geralmente vejo traços duplos "-" sendo usados em vez de traços simples "-" em muitos casos. Eu queria saber se eles eram intercambiáveis, e o que eles significam também. Obrigada!

    
por Kaitlyn Mcmordie 05.01.2012 / 16:03

4 respostas

4

Esta não é uma questão bash per se - tudo nesse comando é um conjunto de argumentos para o comando unix find (1), que se comportaria da mesma maneira, independentemente do shell que você invocar a partir de.

Dado isso, o que você realmente precisa fazer é olhar a documentação para encontrar (1) - e você pode fazer isso executando:

$ man find

ou, se a sua versão do find for a do Gnu (como será se você estiver executando o Linux),

$ info find

para um documento mais semelhante a um livro.

Para sua segunda pergunta: muitos comandos (particularmente aqueles que fazem parte do projeto do Gnu) usam sinalizadores de opções longas no formato

$ command --long-argument --other-long-argument

como uma alternativa aos argumentos curtos da forma

$ command -lo

ou

$ command -l -o

Os comandos que fizerem isso usarão '-' em vez de '-' no início de tais flags, para deixar claro qual tipo de flag de opção está chegando.

    
por 05.01.2012 / 16:17
4

Nesse contexto, o -name está instruindo o comando find a filtrar os resultados para aqueles que terminam com '.html' e o -exec está instruindo o comando find a executar grep com os resultados .

O -l aplica-se ao comando grep e indica que o nome do arquivo do primeiro arquivo de entrada para corresponder ao padrão (ou seja, somethingtobefound ) deve ser impresso e a verificação interrompida. De acordo com a página man , o {} garante que o nome do caminho do arquivo atual seja passado por find e o \; termine o comando.

Em relação a traços duplos versus traços simples, isso é algo que tende a ser específico do programa e não deve ter nenhum significado especial. Dito isso, geralmente você tende a ver traços duplos antes de parâmetros mais longos (ou seja, --show-results ) versus parâmetros de caractere único (ou seja, -s ).

    
por 05.01.2012 / 16:18
3

As respostas podem ser encontradas com o man find:

'
-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; see section STANDARDS CON‐
          FORMANCE below).  To ignore a directory and the files under  it,
          use  -prune; see an example in the description of -path.  Braces
          are not recognised as being special, despite the fact that  some
          shells  including  Bash  imbue  braces with a special meaning in
          shell patterns.  The filename matching is performed with the use
          of  the  fnmatch(3)  library function.   Don't forget to enclose
          the pattern in quotes in order to protect it from  expansion  by
          the shell.

-exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of ';' is encountered.  The string '{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a '\') or quoted to
          protect them from expansion by the shell.  See the EXAMPLES sec‐
          tion for examples of the use of the -exec option.  The specified
          command is run once for each matched file.  The command is  exe‐
          cuted  in  the starting directory.   There are unavoidable secu‐
          rity problems surrounding use of the -exec  action;  you  should
          use the -execdir option instead.

E assim por diante

    
por 05.01.2012 / 16:17
1

Os parâmetros -name e -exec significam "padrão de nome de arquivo ou diretório para procurar" e "executar algo em cada um dos arquivos ou diretórios correspondentes". O {} é substituído pelos resultados que correspondem ao padrão -name , de modo que a instrução -exec possa usá-los como argumentos para os comandos executados. A barra invertida \; significa o final do comando find. Os traços duplos -- normalmente significam opções longas, e. ls --all e o único traço - significa opção curta, por ex. %código%. Ambos significam exatamente o mesmo.

    
por 05.01.2012 / 16:20