Potřebuji smazat všechna kompilovaná data:
- adresáře s názvem
build
, - adresáře s názvem
obj
, - soubory *.so.
Napsal jsem příkaz
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
který projde všechny adresáře rekurzivně a odstraní vše, co potřebuji.
Proč mám na konci takový výstup?
Možná bych měl napsat jiný příkaz.
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
Přijatá odpověď:
Použijte -prune
na adresáře, které se stejně chystáte smazat, abyste řekli find
neobtěžovat se v nich hledat soubory:
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
Všimněte si také, že *.so
musí být citován, protože jinak může být shellem rozšířen na seznam .so
soubory v aktuálním adresáři.
Ekvivalent vašeho GNU -regex
-typ jedna by byl:
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Všimněte si, že pokud budete používat specifickou syntaxi GNU, můžete také použít -delete
místo -exec rm -rf {} +
. Pomocí -delete
, GNU find
zapne -depth
automaticky. Nespouští externí příkazy, takže tímto způsobem je efektivnější a také bezpečnější, protože odstraňuje konfliktní podmínky, kdy vás někdo může přimět odstranit nesprávné soubory změnou adresáře na symbolický odkaz v mezidobí find
najde soubor a rm
odstraní jej (viz info -f find -n 'Security Considerations for find'
podrobnosti).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete