Declarações condicionais: localizando pastas que não contêm um arquivo específico

1

Eu precisava encontrar todas as pastas, cujos nomes têm um dígito nelas, que não contêm um arquivo que termine com .counts.txt. Combinando várias sugestões que encontrei on-line, consegui criar o seguinte comando (para o bash), que faz o que eu quero.

find . maxdepth 1 -type d -name "*[0-9]*" ! -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; -print

No entanto, não entendo alguns de seus recursos:

  1. O que o ponto de exclamação faz aqui? Isso de alguma forma nega a declaração de condição que se segue?
  2. Por que é necessário abrir um novo shell usando sh em vez de direcionar diretamente para ls ?
por GingerBadger 15.07.2017 / 12:19

1 resposta

1
  1. Sim, o ! nega a próxima condição, que é o -exec sh -c 'ls -1 "{}" | egrep -q "*.counts.txt"' \; . Como esta é uma condição -exec que é negada, temos que nos lembrar que ela é verdadeira se o comando que ela executa retornar com status 0 (e negada a condição é verdadeira se o status não for 0).
  2. Os argumentos após -exec não são passados para um shell, mas são executados diretamente, portanto, não há um conceito de pipe disponível. Se você colocar um caractere de pipe lá, o shell externo (que começou a se localizar) usaria isso e all a saída do find iria para egrep.

Veja man find para os documentos sobre ! e -exec args para encontrar.

    
por 15.07.2017 / 13:23