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 .??*

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.


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.


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 '\;'


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.

Dies bricht ab, sobald Sie eine Datei mit Leerzeichen im Namen haben.
ein Lebenslauf vom
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.