Je souhaite supprimer tous les fichiers de l'arborescence de répertoires actuelle, à l'exception de ceux de save
. J'ai exécuté cette commande:
find . \( -name save -prune \) -o -type f -ls | grep /save/
et il n'en a trouvé aucun. Mais quand j'ai exécuté cette commande:
find . \( -name save -prune \) -o -type f -delete
Tous ces fichiers dans / save / étaient partis. Qu'est-ce que je rate?
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 ^^Réponses:
-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 GNUfind
et quelques autres implémentations).Ici, vous avez la possibilité d'utiliser à la
rm
place:(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:
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:
(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).la source
rm
?