Perché trovare ed eseguire con più condizioni non funziona senza parentesi?

1

Ho due comandi find molto simili, solo uno dei quali funziona. Dal momento che è rilevante, devo ricordare che non ci sono file con .c o .hpp estensioni.

# That one works
find ~/src/ \( -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;
# That one doesn't
find ~/src/ -type f -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' -exec echo {} \;
    
posta assp1r1n3 08.07.2016 - 23:15
fonte

1 risposta

1

Bene, non funziona come ti aspetti. Diamo un'occhiata a quello che "non funziona" e applica le parentesi e la logica implicite.

find ~/src \( -type f -a -iname '*.cpp' \) -or \( -iname '*.h' \) -or \( -iname '*.c' \) -or \( -iname '*.hpp' \) -exec echo {} \;

Nessuna azione viene applicata ai file che terminano in cpp o oggetti del file system che terminano in h e c. Solo gli oggetti del file system che terminano in hpp vengono echeggiati perché -exec annulla il comportamento predefinito di find da stampare. Puoi aggiungere -exec echo {} \; o -print alla fine di ciascuna parentesi chiusa, ma è sciocco.

Risolviamo "quello che funziona"

find ~/src -type f \( -iname '*.cpp' -or -iname '*.h' -or -iname '*.c' -or -iname '*.hpp' \) -exec echo {} \;
    
risposta data 09.07.2016 - 14:05
fonte

Leggi altre domande sui tag