Myslím, že jednou jste použili -or
operátor, pak jej musíte udržovat konzistentní, abyste se vyhnuli nejednoznačnému pořadí logických operací, když máte více podmínek propojených pomocí logického OR.
Zdá se, že -exec
část je seskupena společně s druhou -name "*.h"
.
Takže aby to fungovalo správně, musíte přidat závorky, jak je uvedeno níže:
find . '(' -name '*.cpp' -o -name '*.h' ')' -exec echo {} ';'
Případně zkombinujte několik rozšíření do jednoho pomocí -regex
:
find . ! -regex ".*\.\(cpp\|h\)" -exec echo {} \;
Ani. Je to syntaxe voleb, která je "špatná". find
vyhodnocuje sekvenčně. Vyhodnocuje tedy první výraz (-name "*.cpp"
) pak narazí na -o
vlajka. Pokud je první výraz pravdivý, find
nebude pokračovat ve vyhodnocování druhého (-name "*.h" -exec echo {} \;
), místo toho nedělá nic. Vidíte, celá část po -o
je jeden výraz. Proto se to provede pouze pro soubory, které odpovídají druhému výrazu. Proto vidíte pouze 1.h
soubor, který předává pouze druhý výraz. Viz manuálová stránka hledání:
expr1 -o expr2
Or; expr2 is not evaluated if expr1 is true.
Proč je to užitečné? Zvažte následující:
find /path -exec test_file_for_something {} -print \; -o -name "xyz" -exec ls -l {} \;
V tomto příkazu find je soubor přidělen test_file_for_something
jako parametr. Nyní, v závislosti na tom, že příkazy vrátí kód, je první výraz pravdivý (poté -print
je proveden a končí tam) nebo false (pak druhý výraz za -o
příznak je vyhodnocen). A pokud je to pravda (název je xyz
), poté -exec
se provede.
Pro váš problém můžete místo toho použít toto k seskupení prvků dohromady jako jeden výraz :
find . \( -name "*.cpp" -o -name "*.h" \) -exec echo {} \;