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
.