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.
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 {} +
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