Com que finalidade o menos (-) em 'find -! -exec 'serve?

3

Em esta resposta , qual é o uso de -! em find ?

Considere o seguinte código:

find . -type l -! -exec test -e {} \; -print

Essa alternativa parece fazer exatamente a mesma coisa:

find . -type l ! -exec test -e {} \; -print

Parece que o -! funciona como ! , o que significa negação da seguinte expressão. O que faz sentido Mas por que não apenas ! então? Não consigo encontrar nenhuma documentação sobre essa sintaxe.

    
por rld. 08.03.2017 / 04:13

2 respostas

2

Aceitar -! além do padrão ! (e também de outros operadores de pontuação: ( , ) e , específico do GNU) é um capricho do analisador de linha de comando do GNU encontrar. O código só é um pouco mais fácil de escrever se não rejeitar -! e similares como mal formado. Como -! seria um erro, não há problema em aceitá-lo. O padrão POSIX não diz nada sobre o que -! significa: no que diz respeito ao padrão, ele é um predicado definido pela implementação, cujas implementações são livres para usar para indicar o que quiserem.

Aqui está uma visão geral de como o código no GNU encontra funciona:

  • O código do analisador contém um lista de operadores . Os operadores são armazenados sem o seu primeiro - , para tornar o código um pouco menor e mais rápido.
  • O comando analisador de linha chama looks_like_expression para determinar se um argumento se parece com um predicado. Os predicados começam com - , exceto para os operadores de caractere de pontuação única.
  • Depois de determinado o predicado, find_parser ignorou o - se houver um. Este é o ponto em que a distinção entre ! e -! é perdida.

looks_like_expression ou find_parser pode rejeitar - seguido por um caractere de pontuação. Mas de qualquer forma, seria necessário um código adicional sem nenhum benefício real.

    
por 09.03.2017 / 01:29
-1

O -! está negagiando a expressão "-tipo l", o que significa, no seu exemplo, "Listar todas as entradas que não são um link".

-tipo l se tornará verdadeiro, se o "arquivo" for um link, -! negará isso.

Do find manpage:

The POSIX standard specifies parentheses '(', ')', negation '!' and the 'and' and 'or' operators ( -a, -o).

O menos é o separador para as opções. Como em qualquer outro comando, cada opção é separada por menos (por exemplo, ls -l). Não está revertendo o significado do ponto de exclamação (!).

    
por 08.03.2017 / 08:32

Tags