GNU/Linux >> Znalost Linux >  >> Linux

Proč `find` v Linuxu přeskočí očekávané výsledky, když je použito `-o`?

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 {} \;

Linux
  1. Proč tento plášťový ropovod vystupuje?

  2. Proč se v Linuxu používá select

  3. Proč preprocesor C interpretuje slovo linux jako konstantu 1?

  1. Proč máme v LINUXu 3 typy X-výběrů?

  2. Proč se Ctrl + V nevloží do Bash (Linux shell)?

  3. Proč Linux používá odkládací oddíl místo souboru?

  1. Co je POSIX? Proč je to pro uživatele Linuxu/UNIXu důležité?

  2. Od kdy se v Linuxu začíná počítat doba provozuschopnosti?

  3. Proč se používá Swap, když zbývá spousta volné paměti?