web-dev-qa-db-fra.com

Supprimer récursivement tous les fichiers avec une extension donnée

Je souhaite supprimer tous les fichiers * .o d'un répertoire et de ses sous-répertoires. Cependant, j'obtiens une erreur:

sashoalm@aspire:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory

D'autre part, rm *.o fonctionne, mais ce n'est pas récursif.

197
sashoalm

C'est mal: rm -r ne sert pas à supprimer des fichiers mais à supprimer des répertoires. Heureusement, il n'y a probablement aucun répertoire correspondant à *.o.

Ce que vous voulez est possible avec zsh mais pas avec sh ou bash (les nouvelles versions de bash peuvent le faire, mais seulement si vous activez l'option Shell globstar avec shopt -s globstar). Le modèle de globbing est **/*.o mais cela ne serait pas limité aux fichiers aussi (peut-être que zsh a aussi des astuces pour exclure les non-fichiers).

Mais c'est plutôt pour find:

find . -type f -name '*.o' -delete

ou (comme je ne sais pas si -delete est POSIX)

find . -type f -name '*.o' -exec rm {} +
303
Hauke Laging

Ce n'est pas tout à fait comme ça que le -r le changement de rm fonctionne:

   -r, -R, --recursive
          remove directories and their contents recursively

rm n'a pas de fonctionnalité de recherche de fichiers, son -r switch ne le fait pas descendre dans les répertoires locaux et identifier les fichiers correspondant au modèle que vous lui donnez. Au lieu de cela, le modèle (*.o) est développé par le shell et rm descendra et supprimera tous les répertoires dont le nom correspond à ce modèle. Si vous aviez un répertoire dont le nom se terminait par .o, la commande que vous avez essayée l'aurait supprimée, mais elle ne trouvera pas .o fichiers dans les sous-répertoires.

Ce que vous devez faire, c'est utiliser find:

find . -name '*.o' -delete

ou, pour les non-GNU find:

find . -name '*.o' -exec rm -r {} \;

Alternativement, si vous utilisez bash, vous pouvez activer globstar :

shopt -s globstar
rm -r -- **/*.o

[~ # ~] note [~ # ~] : les trois options supprimeront les répertoires dont le nom se termine par .o également, si ce n'est pas ce que vous voulez, utilisez l'une des options suivantes:

find . -type f -name '*.o' -delete
find . -type f -name '*.o' -exec rm {} \;
rm -- **/*.o
62
terdon