Je dois supprimer toutes les données compilées :
- répertoires appelés
build
, - répertoires appelés
obj
, - Fichiers *.so.
J'ai écrit une commande
find ( -name build -o -name obj -o -name *.so ) -exec rm -rf {} ;
qui parcourt tous les répertoires de manière récursive et supprime tout ce dont j'ai besoin.
Pourquoi ai-je une telle sortie à la fin ?
Peut-être devrais-je écrire une commande différente.
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
Réponse acceptée :
Utilisez -prune
sur les répertoires que vous allez supprimer de toute façon pour indiquer find
pas la peine d'essayer d'y trouver des fichiers :
find . ( -name build -o -name obj -o -name '*.so' ) -prune -exec rm -rf {} +
Notez également que *.so
doit être entre guillemets car sinon il peut être étendu par le shell à la liste de .so
fichiers dans le répertoire courant.
L'équivalent de votre GNU -regex
-tapez un serait :
find . ( -name build -o -name obj -o -name '*?.so' ) -prune -exec rm -rf {} +
Notez que si vous allez utiliser une syntaxe spécifique à GNU, vous pouvez tout aussi bien utiliser -delete
au lieu de -exec rm -rf {} +
. Avec -delete
, GNU find
active -depth
automatiquement. Il n'exécute pas de commandes externes, donc de cette façon, c'est plus efficace, et c'est aussi plus sûr car il supprime la condition de concurrence où quelqu'un peut être en mesure de vous faire supprimer les mauvais fichiers en changeant un répertoire en un lien symbolique entre le temps find
trouve un fichier et rm
le supprime (voir info -f find -n 'Security Considerations for find'
pour plus de détails).
find . -regextype posix-egrep -regex '.*/((obj|build)(/.*)?|.+.so)' -delete