Por que é encontrar o arquivo dir -name e não encontrar o arquivo -n dir?

1

Eu procurei por isso, mas não consegui encontrar nada.

Eu sempre quis saber, porque é que a maioria dos outros comandos do bash tem o formato de comando -flag arg1 arg2, ie cp -r dir1 / dir2 / mas aqui o comando find de alguma forma coloca o flag no meio entre dois argumentos?

find path/ -name pattern

É inconsistente para mim e torna difícil lembrar. Existe uma boa razão para isso? Alguma convenção de que não conheço?

    
por user2193268 26.04.2016 / 10:28

4 respostas

4

Os comandos vieram primeiro, a consistência foi adicionada mais tarde.

A primeira página de manual que você provavelmente encontrará mostra como

find expressão do nome do caminho

find remonta aos anos 70, e os pressupostos de ordenação e até de sintaxe (se um traço é necessário para opções) foram adicionados a vários comandos mais tarde (digamos durante o final dos anos 80 e início dos anos 90) para ajudar os usuários a lembrar a sintaxe de vários comandos. No caso de find , por exemplo, os desenvolvedores estavam cientes de algumas inconsistências:

BUGS
There is no way to check device type.
Syntax should be reconciled with if.

Portanto, a resposta correta é que o comando fazia sentido para os desenvolvedores originais, e nenhuma mudança significativa foi feita.

    
por 26.04.2016 / 10:32
2

Você parece ter confundido algumas coisas. Nem find nem cp são internos do shell. O único argumento no comando find é o caminho, o resto são opções e seus valores, mas isso é apenas semântica, a distinção aqui não é muito importante. Mais importante, existem duas classes de sinalizadores de opção. Aqueles que aceitam argumentos e aqueles que não aceitam. Para aqueles que o fazem, o formato mais comum é:

command -flag flagValue

Enquanto muitos programas usam sinalizadores de letra única ( command -f ), muitos usam opções simples e longas (praticamente todas as ferramentas GNU, por exemplo). Você mencionou cp , este é um comando cp válido:

cp -dR --preserve=all -i --dereference foo bar baz/

Em geral, o formato "padrão", o mais comum, é:

command -flag1 -flag2 value1 -flag3 value2 ARGUMENTS

Em outras palavras, muitos sinalizadores não são simples booleanos e também assumem valores. Encontrar não é uma exceção. Mesmo cp que você cita faz isso:

cp -t /foo -u file1 file2 fileN

Portanto, não é verdade que a maioria dos comandos tenha o formato command -flag arg1 arg2 , muito pelo contrário. Depende apenas das bandeiras usadas. Quanto ao motivo pelo qual os find devs escolheram este formato específico, receio que você tenha que perguntar a eles.

    
por 26.04.2016 / 10:38
2

find e cpio foram criados por Dick Haight e não pelas pessoas que escreveram a maioria dos utilitários originais do Unix. Não havia uma biblioteca de análise de argumento de linha de comando no momento em que você pudesse vincular como uma biblioteca, e isso reforçaria / estimularia alguma consistência (em meados dos anos 80 eu tinha código fonte para getopt em vários sistemas)

Quando as pessoas usam comandos e seus argumentos em scripts, é difícil alterar a sintaxe da funcionalidade existente.

    
por 26.04.2016 / 10:43
0

find não é um comando simples que é controlado por opções, mas um comando que implementa uma linguagem de controle própria.

A CLI find parece:

find [options] path1..pathn [expression]

Onde as opções são, por exemplo -H , -L , -P e expression é um script escrito em find control language .

Os parâmetros como -name são chamados: primaries , porque são operadores primários e a expressão completa pode ser vista como uma descrição matemática de um filtro e ações como -print , -exec .

O find command language é uma linguagem muito poderosa, mas ainda assim fácil de aprender. Programas que percorrem árvores de diretórios e tentam implementar seu comportamento por meio das opções clássicas da linha de comando do UNIX, geralmente são menos poderosos ou difíceis de aprender. Veja por exemplo GNU tar vs. star (o último suporta para usar o find command language .

    
por 26.04.2016 / 12:33