it-swarm.com.de

Löschen Sie rekursiv alle Dateien mit einer bestimmten Erweiterung

Ich möchte alle * .o-Dateien in einem Verzeichnis und seinen Unterverzeichnissen löschen. Ich erhalte jedoch eine Fehlermeldung:

[email protected]:~/.Workspace.OLD$ rm -r *.o
rm: cannot remove `*.o': No such file or directory

Auf der anderen Seite, rm *.o funktioniert, ist aber nicht rekursiv.

197
sashoalm

Das ist böse: _rm -r_ dient nicht zum Löschen von Dateien, sondern zum Löschen von Verzeichnissen. Zum Glück gibt es wahrscheinlich keine Verzeichnisse, die mit _*.o_ übereinstimmen.

Was Sie wollen, ist mit zsh möglich, aber nicht mit sh oder bash (neue Versionen von bash können dies, aber nur, wenn Sie die Shell-Option globstar mit _shopt -s globstar_). Das Globbing-Muster ist _**/*.o_, aber das wäre nicht nur auf Dateien beschränkt (möglicherweise hat zsh auch Tricks zum Ausschluss von Nicht-Dateien).

Aber das ist eher für find:

_find . -type f -name '*.o' -delete
_

oder (da ich nicht sicher bin, ob _-delete_ POSIX ist)

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

So funktioniert der Schalter -r Von rm nicht ganz:

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

rm hat keine Dateisuchfunktion, der Schalter -r führt nicht dazu, dass er in lokale Verzeichnisse absteigt und Dateien identifiziert, die dem von Ihnen angegebenen Muster entsprechen. Stattdessen wird das Muster (*.o) Von der Shell erweitert und rm wird in alle Verzeichnisse absteigen und diese entfernen, deren Name mit diesem Muster übereinstimmt. Wenn Sie ein Verzeichnis hätten, dessen Name auf .o Endet, hätte der von Ihnen versuchte Befehl es gelöscht, aber es werden keine .o - Dateien in Unterverzeichnissen gefunden.

Was Sie tun müssen, ist entweder find zu verwenden:

find . -name '*.o' -delete

oder für Nicht-GNU find:

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

Wenn Sie alternativ bash verwenden, können Sie globstar aktivieren:

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

[~ # ~] Hinweis [~ # ~] : Alle drei Optionen löschen auch Verzeichnisse, deren Name auf .o endet, wenn das ist nicht was du willst, benutze eines davon:

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