Avaliação de find (-exec)

1

Estou procurando todos os arquivos que contêm um conjunto de strings. Se sim, altero seus direitos de acesso.

 find . -type f -exec grep -q '#!/bin/bash\|#!/usr/bin/grep\|#!/usr/bin/awk' {} \; -exec chmod 700 {} ;\

Estou curioso sobre como o find funciona quando ele encontra um arquivo contendo essa string grep -q me dá 0 para que outro exec execute, mas não deveria. Esse segundo exec localiza todos os arquivos e altera os direitos de todos os arquivos. Por que funciona e altera apenas os arquivos que contêm essa string?

    
por pnom 02.05.2016 / 12:28

1 resposta

4

Não sei qual é a sua intenção (você não deixou isso claro), mas se for chmod para 700 todos os arquivos que correspondem ao padrão, então, com exceção do seu erro de digitação ( ;\ em vez de \; ), seu comando parece funcionar como pretendido.

No entanto:

when it finds a file containing that string grep -q gives me 0 so another exec executes but should not.

Sim, deve fazer. 0 significa sucesso significa true, então find continua a avaliar sua expressão e o segundo -exec é executado. 1 (ou qualquer valor diferente de 0) significaria falha significaria false, então find iria causar curto-circuito em sua avaliação (existe um E lógico implícito entre expressões justapostas), então o segundo -exec não é executado.

Why does it work

Verifique a página de manual do GNU find :

expr1 expr2

Two expressions in a row are taken to be joined with an implied "and"; expr2 is not evaluated if expr1 is false.

    
por 02.05.2016 / 13:53