find
ist sehr nützlich, um selektiv Aktionen für einen ganzen Baum auszuführen.
find . -type f -name ".Apple*" -delete
Hier -type f
wird sichergestellt , dass es sich um eine Datei und nicht um ein Verzeichnis handelt und möglicherweise nicht genau das ist, was Sie möchten, da auch Symlinks, Sockets und andere Dinge übersprungen werden. Sie können verwenden ! -type d
, was wörtlich nicht Verzeichnisse bedeutet, aber Sie können dann auch Zeichen löschen und Geräte blockieren. Ich würde vorschlagen, das -type
Prädikat auf der Manpage für zu betrachten find
.
Um dies ausschließlich mit einem Platzhalter zu tun, benötigen Sie erweiterte Shell-Unterstützung. Bash v4 hat die globstar
Option , mit der Sie Unterverzeichnisse rekursiv abgleichen können **
. zsh
und ksh
unterstützen auch dieses Muster. Damit können Sie tun rm -rf **/.Apple*
. Dies ist kein POSIX-Standard und nicht sehr portabel. Daher würde ich die Verwendung in einem Skript vermeiden, aber für eine einmalige interaktive Shell-Aktion ist dies in Ordnung.
find . -type d -name .Apple*
an die Arbeit gehen - es werden alle Ordner aufgelistet. Es schlägt jedoch fehl, wenn ich-delete
am Ende hinzufüge . Es kommt gerade mit der Verwendungszusammenfassung zurück. Es läuft auf BusyBox v1.1.1. Macht das einen Unterschied?-delete
ist auch nicht POSIX.**
wurdezsh
in den frühen 90er Jahren eingeführt. Es ist jetzt (in chronologischer Reihenfolge des Auftretens) auch in ksh93, fish, bash und tcsh.rm -rf **/.Apple*
-delete
nicht funktioniert,-exec rm -f {} +
stattdessen verwenden.find
beim Löschen ausführlich sein? Ich nehme an, die "globstar" -Methode würde dies tun, indem sie den-v
Schalter hinzufügt .Ich habe Probleme beim Verwenden von
find
mit-delete
aufgrund des absichtlichen Verhaltens vonfind
(dh Verweigern des Löschens, wenn der Pfad mit ./ beginnt, was in meinem Fall der Fall ist), wie in der Manpage angegeben:Stattdessen konnte ich es einfach tun
In Ihrem Fall schien es die Lösung zu sein, den Glob (Sternchen, *) anzugeben, aber ich wollte meine Antwort geben, falls jemand anderes ein ähnliches Problem hatte.
HINWEIS: Zuvor lautete meine Antwort wie folgt, aber @Wildcard wies in den Kommentaren auf die Sicherheitslücken hin, die darin bestehen.
quelle
xargs
hier zu verwenden .-exec rm -r {} \;
oder, besser,-exec rm -r {} +
funktioniert auch ohne Fehler bei Dateinamen für Sonderzeichen. Siehe Warum ist das Schleifen über Finds Ausgabe eine schlechte Übung?mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
in Ihrem Verzeichnis und führen Sie denselben Befehl erneut aus, wenn Sie nicht glauben, dass Daten verloren gehen können. Oder da die Frage ist über Mac OSmkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
. ( Warnung: Sie werden alle Ihre Dateien löschen, wenn Sie dies tun. Das ist meine Art von Punkt.)Möglicherweise liegt an Ihrem Befehl rm / find nichts Falsches vor, aber der Benutzer, mit dem Sie angemeldet sind, verfügt tatsächlich nicht über Löschberechtigungen. Verwenden
ls -l
Sie diese Option, um Dinge mit ihren Berechtigungen aufzulisten, und um zu identifizieren, wer Sie mit den Befehlenid
und sindgroups
(beide sollten verfügbar sein). Wenn Sie der "falsche Benutzer" sind, müssen Sie entweder die Berechtigungen / den Besitz der Dateien ändern oder zu einem anderen Benutzer wechseln.quelle
Versuchen:
quelle
dotglob
ist hier nutzlos. Auf dieser Seite finden Sie ein Beispiel für die Funktionsweise von dotglob.Einfacher Befehl:
Viel Glück!
quelle