find
est très utile pour effectuer sélectivement des actions sur tout un arbre.
find . -type f -name ".Apple*" -delete
Ici, le -type f
vérifie que c'est un fichier, pas un répertoire, et peut ne pas être exactement ce que vous voulez, car il ignorera également les liens symboliques, les sockets et d'autres choses. Vous pouvez utiliser ! -type d
, ce qui signifie littéralement pas des répertoires, mais vous pouvez également supprimer des caractères et bloquer des périphériques. Je suggérerais de regarder le -type
prédicat sur la page de manuel pour find
.
Pour le faire strictement avec un caractère générique, vous avez besoin d’une prise en charge avancée du shell. Bash v4 a l' globstar
option , qui vous permet de faire correspondre récursivement les sous-répertoires en utilisant **
. zsh
et ksh
soutenir également ce modèle. En utilisant cela, vous pouvez faire rm -rf **/.Apple*
. Ce n'est pas standard POSIX, et pas très portable, donc je voudrais éviter de l'utiliser dans un script, mais pour une action shell interactive unique, c'est très bien.
find . -type d -name .Apple*
au travail - il répertorie tous les dossiers. Cependant, cela échoue lorsque j'ajoute-delete
à la fin. Il ne fait que revenir avec le résumé de l'utilisation. Il fonctionne sur BusyBox v1.1.1. Cela fait-il une différence?-delete
n'est pas POSIX non plus.**
a été introduit parzsh
au début des années 90. C'est maintenant (par ordre chronologique d'apparition) également dans ksh93, fish, bash et tcsh.rm -rf **/.Apple*
-delete
ne fonctionne pas, utilisez-exec rm -f {} +
plutôt.find
à être commenté alors qu'il supprime? Je suppose que la méthode "globstar" le ferait en ajoutant le-v
commutateur.J'ai rencontré des problèmes d'utilisation
find
avec en-delete
raison du comportement intentionnel defind
(c'est-à-dire refuser de supprimer si le chemin commence par ./, ce qu'ils font dans mon cas), comme indiqué dans sa page de manuel:Au lieu de cela, j'ai pu faire
En ce qui concerne votre cas, il semble que la solution soit la citation du glob (astérisque, *), mais je voulais donner ma réponse au cas où quelqu'un d'autre aurait le même problème.
NOTE: Auparavant, ma réponse était de procéder comme suit, mais @Wildcard a souligné les failles de sécurité dans les commentaires.
la source
xargs
ici.-exec rm -r {} \;
ou, mieux,-exec rm -r {} +
fera aussi bien sans manquer aux noms de fichiers de caractères spéciaux. Voir Pourquoi la boucle sur la sortie de find est-elle une mauvaise pratique?mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
dans votre répertoire, puis réexécutez la même commande si vous ne croyez pas qu'il existe un risque de perte de données. Ou, puisque la question est sur Mac OS,mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
. ( Attention: vous effacerez tous vos fichiers si vous le faites. C'est un peu ce que je veux dire.)Ce qui est possible, c’est que votre commande rm / find n’est pas un problème, mais que l’utilisateur auquel vous êtes connecté ne dispose pas en réalité des autorisations de suppression. Utilisez cette option
ls -l
pour répertorier les éléments avec leurs autorisations, et vous pouvez identifier qui vous êtes avec les commandesid
etgroups
(l'une ou l'autre doit être disponible). Si vous êtes le "mauvais utilisateur", vous devrez soit modifier les autorisations / la propriété des fichiers, soit basculer vers un autre utilisateur.la source
Essayer:
la source
dotglob
est inutile ici. Voir cette page pour un exemple de ce que fait le dotglob.Commande simple:
Bonne chance!
la source