Je dois supprimer toutes les données compilées:
- des répertoires appelés
build
, - des répertoires appelés
obj
, - fichiers * .so.
J'ai écrit une commande
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
cela 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 que je devrais é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
find
comme ceci enfind /search_directory options
omettant le répertoire de recherche n'est pas une bonne idéeRéponses:
Utilisez
-prune
quand même sur les répertoires que vous allez supprimer pourfind
éviter de chercher plus facilement des fichiers:Notez également que cela
*.so
doit être cité, sinon le shell peut l’étendre à la liste des.so
fichiers du répertoire en cours.L'équivalent de votre
-regex
type GNU 1 serait:Notez que si vous utilisez une syntaxe spécifique à GNU, vous pouvez également utiliser à la
-delete
place de-exec rm -rf {} +
. Avec-delete
, GNUfind
s’allume-depth
automatiquement. Il n’exécute pas de commandes externes, il est donc plus efficace et plus sûr, car il supprime la situation critique dans laquelle une personne peut vous faire supprimer les mauvais fichiers en transformant un répertoire en un lien symbolique entre-temps.find
trouve un fichier et lerm
supprime (voir lesinfo -f find -n 'Security Considerations for find'
détails).la source
-delete
gère également des choses comme les espaces mieux-exec rm -rf {} +
ce qui n'a pas de problème avec ceux-là non plus.{}
- faut-il les citer ou non? Cela semble fonctionner sans guillemets, mais GNU Findutils Manual utilise cet'{}'
exemple. Pourriez-vous s'il vous plaît clarifier?csh
, mais je n'ai jamais pu vérifier cette affirmation. Ils ne sont nécessaires dans aucune coque moderne que je connaisse. Ils ne sont certainement pas requis par POSIX. Les exemples POSIX ne les utilisent pas.-delete
ne peut pas être utilisé avec des répertoires.Je suppose que la raison en est que
find
l’arborescence de répertoires est d'abord effacée et que le contenu du répertoire est vérifié, ce qui n'est évidemment pas le meilleur ordre possible. Vous pouvez forcerfind
à vérifier le contenu en premier:Vous devriez envisager d'utiliser
-delete
pour les fichiers et-exec rmdir
pour les répertoires.la source
Ma solution
+ vs \; dans la commande -exec
la source
-exec … {} +
exécute la commande pour plusieurs fichiers à la fois, autant que possible sur la ligne de commande. S'il y a trop de fichiers (ou plus précisément si la longueur totale des chemins est trop longue),find
exécutera plusieurs instances derm
, et pourrait donc finir par supprimer un répertoire qu'il traverse. C'est moins probable avec+
que avec;
, mais+
ne résout pas le problème.