Wie lösche ich alle versteckten Dateien und Verzeichnisse mit Bash?

28

Die offensichtliche Lösung ergibt einen Exit-Code von 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Eine mögliche Lösung überspringt das "." und ".." Verzeichnisse löschen jedoch nur Dateien, deren Namen länger als 3 Zeichen sind:

bash$ rm -f .??*
Yonatan Broza
quelle
Nun, wenn Sie nicht zu besorgt sind, nicht entfernen zu können. & .. wen interessiert es dann? es sei denn, Sie machen sich Sorgen über hässliche Ausgaben in einem Skript, dann denke ich, dass die offensichtliche Lösung darin besteht, weniger zu tippen als die anderen ganz offen.
Matt
Nur damit Sie wissen, .. und. sind keine Dateien. Sie sind Verweise auf Verzeichnisse. . (nur ein einzelner Punkt) ist das aktuelle Verzeichnis, und .. (zwei Punkte) ist ein Link zum Verzeichnis eine Ebene höher. Zum Beispiel, wenn cd / home / user,. ist gleich / home / user und .. ist / home / Mit anderen Worten, Sie können das nicht löschen. und .. (.?)
Phuzion
Danke für den Kommentar Matt. Ich benutze den Befehl oft in Skripten mit Exit-Code-Prüfung (set -e). In diesen Fällen ist ein vorläufiger Beendigungscode erforderlich.
Yonatan Broza
Es ist nichts inhärent. und .. das schützt sie vor dem Löschen mit rm -rf. Dies ist nur ein Schutzmechanismus, der in modernen RM-Varianten hinzugefügt wurde.
Kubanczyk
Und es gibt immer rm -rf. * || true, wenn Sie nur das Verhalten von set -e für diese eine Anweisung umgehen möchten.
Domingo Ignacio Galdos

Antworten:

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

Sollte alle Fälle fangen. Das. ?? * passt nur zu Dateinamen mit mehr als 3 Zeichen (wie in der vorherigen Antwort erläutert), das. [^.] Fängt zwei beliebige Zeichen (außer ..) ab.

Russell Heilling
quelle
Danke für die Antwort! Darauf aufbauend bin ich auch auf die kürzere Version von "rm -rf. [^.] *" Gekommen.
Yonatan Broza
4
Seien Sie vorsichtig mit dieser kürzeren Version, sie liefert ähnliche, aber nicht identische Ergebnisse. Es werden keine Namen mit zwei Punkten an der Vorderseite gefunden (z. B. "... /", bei dem manchmal Rootkits versteckt werden usw.)
Russell Heilling
Und seien Sie vorsichtig, um einen PWD-Check
durchzuführen
Das scheint nicht zu funktionieren zsh. Irgendwelche Vorschläge?
Ryanjdillon
Mit zshder Standardeinstellung wird ein leeres Platzhalter Spiel als Fehler behandelt; wohingegen bashdamit einfach unverändert weitergereicht wird. Um zshverhalten sich die gleiche Weise können Sie den Befehlunsetopt nomatch
Russell Heilling
1
find -path './.*' -delete

Dies entspricht allen Dateien im aktuellen Verzeichnis, die mit einem beginnen, .und löscht diese rekursiv. Versteckte Dateien in nicht versteckten Verzeichnissen werden nicht berührt.

Für den Fall, dass Sie wirklich alles aus einem Verzeichnis find -deletelöschen möchten , würde dies ausreichen.

Fritz
quelle
Dies löscht alles, nicht nur die Einträge, die mit.
kasperd 10.11.15
Oh, anscheinend habe ich die Frage als "alles löschen, einschließlich versteckter Dateien" falsch verstanden ... Nun, meine schlechte.
Fritz
@kasperd Danke, jetzt sollte es eigentlich die Frage beantworten.
Fritz
0

Der beste Weg ist wahrscheinlich:

  • finden . -iname. * -maxtiefe 1 -type f -exec rm {} \;

Ändern Sie rm in ls -l, wenn Sie nur sehen möchten, was gelöscht werden soll. Um die Ausgabe ausführlicher darzustellen, möchten Sie u. U. die Option -v zu rm hinzufügen

  • -type f options weist find an, nur nach Dateien zu suchen (Verzeichnisse, Links usw. weglassen)
  • -maxdepth 1 weist find an, nicht in Unterverzeichnisse zu wechseln

ps. vergiss nicht '\;'


quelle
1
Vorsichtig! Du meinst -iname '. *' Oder -iname. * Oder du wirst hineinziehen. und .. sowieso wieder.
Domingo Ignacio Galdos
-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.
SergioAraujo
quelle
Dies bricht ab, sobald Sie eine Datei mit Leerzeichen im Namen haben.
ein Lebenslauf vom