-delete
implique -depth
que cela ne fonctionne pas -prune
( -depth
commence par les feuilles). Il y a un avertissement à ce sujet dans le manuel de la version GNU ( -delete
est une extension FreeBSD désormais également prise en charge par GNU find
et quelques autres implémentations).
info find --index-search=-delete
L'utilisation de l'action '-delete' sur la ligne de commande active automatiquement l'option '-depth' (* notez find Expressions: :). Cela peut être surprenant si vous testiez auparavant avec '-print', il est donc généralement préférable de ne pas oublier d'utiliser explicitement '-depth'.
info find --index-search=-prune
Parce que «-delete» implique «-depth», l'utilisation de «-prune» en combinaison avec «-delete» peut entraîner la suppression de plus de fichiers que vous ne le souhaitiez.
Ici, vous avez la possibilité d'utiliser à la rm
place:
find . -name save -prune -o -type f -exec rm -f {} +
(potentiellement dangereux s'il y a des répertoires accessibles en écriture par d'autres personnes, car on pourrait vous faire supprimer des fichiers en dehors de l'arborescence de répertoires actuelle en remplaçant les répertoires par des liens symboliques pendant que vous exécutez cette commande).
Une alternative plus sûre:
find . -name save -prune -o -type f -execdir rm -f -- {} \;
Cela n'a pas le problème mentionné ci-dessus mais signifie en exécuter un rm
par fichier. Le --
est nécessaire pour l'implémentation de FreeBSD, pas celui de GNU qui préfixe les noms de fichiers ./
.
Alternativement, comme suggéré par Costas:
LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete
(mais qui descend toujours inutilement dans les save
répertoires)
L' LC_ALL=C
est là *
correspond donc à n'importe quelle séquence d'octets (même ceux qui ne forment pas de caractères valides dans les paramètres régionaux actuels). Notez que cela affectera la langue des messages d'erreur (l'anglais au lieu de la langue de l'utilisateur).
mv save/ ../some/safer/location
avant une telle commande de suppression "générique" (... mais bien sûr, avant votre publication, j'aurais fait la même vérification et rencontré les mêmes problèmes!). Maintenant, allez trouver un bon "undelete" pour le système de fichiers sur lequel les fichiers étaient ^^