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