Pokud -prune nefunguje pro vás, toto bude:
find -name "*.js" -not -path "./directory/*"
Upozornění: vyžaduje procházení všech nežádoucích adresářů.
Použijte -prune hlavní. Například pokud chcete vyloučit ./misc :
find . -path ./misc -prune -o -name '*.txt' -print
Chcete-li vyloučit více adresářů, NEBO je vložte do závorek.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
Chcete-li vyloučit adresáře se specifickým názvem na jakékoli úrovni, použijte -name primární místo -path .
find . -type d -name node_modules -prune -o -name '*.json' -print
Zdá se mi, že následující je jednodušší než jiná navrhovaná řešení:
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Důležitá poznámka: cesty, které zadáte po -path musí přesně odpovídat hodnotě find tiskne bez vyloučení. Pokud tato věta mate, ujistěte se, že používáte úplné cesty skrz celek příkaz takto:find /full/path/ -not \( -path /full/path/exclude/this -prune \) ... . Chcete-li lépe porozumět, přečtěte si poznámku [1].
Uvnitř \( a \) je výraz, který bude odpovídat přesně build/external (viz důležitá poznámka výše) a v případě úspěchu se vyhnete procházení čehokoli níže . Ten je pak seskupen jako jeden výraz s uvozenými závorkami a předponou -not což udělá find přeskočit vše, co odpovídalo tomuto výrazu.
Někdo by se mohl zeptat, zda přidat -not neskryje všechny ostatní soubory pomocí -prune se znovu objeví a odpověď je ne. Způsob -prune funguje to tak, že cokoli, čeho se po dosažení dosáhne, budou soubory pod tímto adresářem trvale ignorovány.
Toto pochází ze skutečného případu použití, kdy jsem potřeboval zavolat yui-compressor na některé soubory generované Wintersmith, ale vynechat ostatní soubory, které je třeba odeslat tak, jak jsou.
Poznámka [1] :Pokud chcete vyloučit /tmp/foo/bar a spustíte find takto "find /tmp \(... " pak musíte zadat -path /tmp/foo/bar . Pokud na druhou stranu spustíte, najděte takto cd /tmp; find . \(... pak musíte zadat -path ./foo/bar .