Entfernt rm -rf * alle Dateien / Ordner im aktuellen Verzeichnis?

20

Werden rm -rf *alle Dateien / Ordner im aktuellen Verzeichnis entfernt? Ich möchte sicherstellen, dass der Platzhalter *nicht in den oberen Verzeichnissen aufsteigt und mein gesamtes Dateisystem löscht. : D

Ich erinnere mich chmod 777 .* -Ran chmodversteckte Dateien und chmodmein gesamtes Dateisystem. Offensichtlich war ich auf dem Root-Account.

Olivier Lalonde
quelle
1
Aus diesem Grund würde ich rm -rf ./*das aktuelle Verzeichnis tun und explizit angeben ... aber Ankur scheint zu sagen, dass es sowieso keine Rolle spielt.
Mpen
@Mark: Was ist der Unterschied zwischen .. und ./ ..? Sie können versuchen, cd ./ .. und sehen, wo Sie enden :)
Johan
@Johan: Kein Unterschied ... Ich denke, es macht einfach mehr Sinn in meinem verrückten Kopf: D
mpen
@Mark: leichtes Versehen :)
Johan

Antworten:

15

Nein, wenn Sie Ihre Shell nicht viel optimiert haben, werden dadurch keine Dateien oder Verzeichnisse entfernt, die mit a beginnen .. Um sie auch zu entfernen, können Sie sie entweder explizit auflisten

rm -rf .file .dir

oder benutze die richtigen Glob-Muster (danke Chris)

rm -rf .[^.]* ..?*

BEARBEITEN Der Punkt hier ist, dass Sie nicht verwenden können .*, um Dateien wie .file, weil .*oder .*?auch ..oder zuzuordnen .. .[^.]*Sucht nach Dateien wie .file, und ..?*sucht nach Dateien wie ..foo( *sucht nach null oder mehr Zeichen und ?sucht nach genau einem).

Benjamin Bannier
quelle
1
Sie brauchen auch etwas ..?*, um Einträge abzufangen, die mit ".." beginnen (zB ..foo).
Chris Johnsen
@ Chris: OK, ich habe diesen wählerischen Wahnsinn angefangen, du hast recht;)
Benjamin Bannier
Es geht nicht nur darum, die "richtigen" Glob-Muster zu verwenden, sondern auch um die Anzahl der übereinstimmenden Elemente. In Verzeichnissen mit einer großen Anzahl von Dateien ist die Shell höchstwahrscheinlich nicht in der Lage, 50.000 Dateien in einer Umdrehung zu übergeben rm. Daher ist das Löschen des Inhalts eines Verzeichnisses mit * nicht der klügste Weg, imho.
Akira
Ich denke, das Erklären xargsgeht etwas über den Rahmen dieser Frage hinaus. Man könnte zB darüber nachdenken, wenn die Shell die Länge der Argumentliste beanstandet.
Benjamin Bannier
1
Ich denke, es ist nicht aus dem Rahmen, weil ich denke, OP ist nicht sicher, wie man sein ultimatives Problem / Lösung erreicht: Entfernen Sie den gesamten Inhalt des Verzeichnisses. OP tut einfach das allgemeine "Falsche", indem es bereits eine (schlechte) Lösung im Sinn hat und fragt, warum diese Lösung Probleme verursacht. Ein besserer Ansatz wäre: "Wie lösche ich alle Dateien in einem Verzeichnis, ohne das Verzeichnis selbst zu löschen?" Die Lösung von OP wird aufgrund der Art und Weise, wie das Globbing funktioniert, Probleme verursachen.
Akira
12

Wenn Sie ein Verzeichnis und seinen gesamten Inhalt entfernen möchten, können Sie chdirdas übergeordnete Verzeichnis und rm -rfdieses Verzeichnis unter Umgehung der gesamten globalen Frage nach Namen sortieren. Wenn Sie den Inhalt entfernen und das Verzeichnis behalten möchten, ist es am einfachsten, alle zu entfernen und dann das Verzeichnis neu zu erstellen.

Es ist kompliziert, einen Glob zu entwickeln, der allen möglichen Verzeichniseinträgen entspricht, die gespeichert werden. und ..; Es ist einfach, eine einfache Antwort zu finden (z. B. * .??*), die in der Praxis fast immer funktioniert. Dies ist für die interaktive Verwendung in Ordnung, da es leicht zu merken ist und die Zeiten, in denen es nicht funktioniert, mit einem Post-RM abgefangen werden können ls -a. Bei einem Skript ist es einfacher, alle zu entfernen und das leere Verzeichnis neu zu erstellen.

mpez0
quelle
1
Das ist, was ich auch vorschlagen würde: das Verzeichnis wegwerfen und fertig
Akira
Auch wenn es nicht die Antwort ist, ist es eine gute Idee.
Johan
10

Da ich der Meinung bin, dass sich diese Frage eher darauf bezieht, was * tut (und nicht rm), versuchen wir es mit einem anderen Ansatz.


Wenn Sie sich nicht sicher sind, was das * bewirkt, können Sie es zuerst mit einem harmlosen Befehl wie echo "testen". Versuchen Sie, bevor Sie dies ausführen, zu erraten, was sie anzeigen, wenn Sie sie in Ihrem Heimverzeichnis ausführen.

echo *
echo .*

Aber zuerst wollen wir einen Spielplatz schaffen, auf dem wir mit den Sternen spielen und sehen können, womit wir enden.

mkdir ~/star_test/
cd ~/star_test/
>.file1
>file2

In diesem Verzeichnis haben wir Folgendes:

cj@zap:~/star_test$ ls -1a
.
..
.file1
file2

Beachten Sie nun, zu was das * mit dem Befehl echo erweitert wird:

cj@zap:~/star_test$ echo *
file2
cj@zap:~/star_test$ echo .*
. .. .file1

Mal sehen, was mit dem Befehl rm passiert

cj@zap:~/star_test$ rm -rf *
cj@zap:~/star_test$ ls -1a
.
..
.file1

Wie Sie sehen, hat er nur die Datei2 entfernt, da * nur zu Datei2 erweitert wurde. Wenn Sie rm -rf. * Eingeben würden, wäre das dasselbe wie Schreiben

rm -rf . .. .file1

Und um ehrlich zu sein, das sieht nicht lustig aus;)

Hoffe, dies klärt den * Teil Ihrer Frage.


Update: Ankur Goel weist jedoch darauf hin, dass in rm eine Art Schutz integriert ist (ungewöhnlich für Shell-Befehle :)

Erstellen wir einen neuen Spielplatz:

cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2

Jetzt haben wir das also wieder, aber mit test1 im Besitz von root als Schutz, wenn ich anfange wütend zu werden.

cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
cj@zap:~/star_test/test1/test2/test3$ echo .*
. .. .file1

Also lasst uns alles entfernen:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
cj@zap:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

Und es sieht aus wie rm nicht entfernt hat. und ... auch wenn wir es ihm sagten !!!

Nach dieser langen Antwort erweist es sich als sicher, alles in einem Verzeichnis zu entfernen:

rm -rf * .*

Aber ich würde dies mit Vorsicht verwenden, da ich nicht sicher bin, ob sich alle Implementierungen von rm so verhalten!

Johan
quelle
7

Ja. Mit rm -rf werden nur Dateien und Ordner im aktuellen Verzeichnis gelöscht, und der Dateibaum wird nicht nach oben verschoben. rm folgt auch keinen Symlinks und löscht die Dateien, auf die es verweist, damit Sie nicht versehentlich andere Teile Ihres Dateisystems entfernen.

Ankur Goel
quelle
1

Wenn Sie nicht eine Ebene nach oben verschieben möchten, wie in mpez0 und rm -rfdiesem bestimmten Ordner beschrieben, können Sie alle Verzeichnisse / Dateien außer .und ..im aktuellen Ordner bearbeiten, indem Sie folgende Schritte ausführen :

rm -rf $(ls -A)

Wenn eines der Verzeichnisse / Dateien eines der Zeichen in der Shell- IFSSondervariablen enthält (z. B. Leerzeichen, Tabulator, Zeilenvorschub), möchten Sie möglicherweise zuerst das IFS ändern, den Befehl ausführen und dann das IFS wiederherstellen.

tzot
quelle
0

Eine viel einfachere Methode zum Leeren eines gesamten Ordners, bei der auch die in dieser Antwort behandelten Probleme mit zu vielen Argumenten vermieden werden , besteht darin, das Verzeichnis selbst einfach zu löschen und neu zu erstellen. Verwenden Sie die folgenden Zeilen, um sicherzustellen, dass dies ordnungsgemäß funktioniert, wenn Sie sich in einem verknüpften Verzeichnis befinden:

cd ..
rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink
                        # by using readlink, to recreate the linked-to directory
mkdir $(readlink -f yourdir) # recreate the directory to have it empty
cd yourdir

(Wenn Sie yourdiranstelle von verwenden $(readlink -f yourdir), ersetzen Sie den Link nur, während der ursprüngliche Speicherort voll bleibt.)

Tobias Kienzler
quelle
1
Dies kann Probleme verursachen, die vom Inode des Ordners abhängen, und Berechtigungen, atime / mtime / ctime / btime, erweiterte Attribute und Zugriffssteuerungslisten verwerfen.
Daniel Beck
@ DanielBeck danke, gute Punkte. Obwohl ich mich frage, was würde gültig auf die Inode abgesehen von Hardlinks (auf Verzeichnisse, die sowieso stark entmutigt sind) verlassen? Berechtigungen usw. sind jedoch wichtig. Im allgemeinsten Fall sollte man also wahrscheinlich xargs...
Tobias Kienzler
OS X enthält einen Mechanismus, der Dateien und Ordner verarbeiten kann, die verschoben werden, und die Zuordnung jedoch beibehält. Am sichtbarsten im Menü " Zuletzt verwendete Dokumente öffnen" . AFAICT verwendet Inodes, um dies intern zu erreichen. Weitere Infos . Es würde mich nicht wundern, wenn andere Systeme etwas Ähnliches implementieren würden, z. B. in APIs für GUI-Programme.
Daniel Beck