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


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

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

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

bash$ rm -f .??*

26
2017-07-30 08:37


Ursprung


Gut, wenn Sie nicht zu besorgt sind, dass Sie nicht in der Lage sind, es zu entfernen. & .. dann wen interessiert das? es sei denn, du sorgst dich um hässliche Ausgaben in einem Skript, dann denke ich, dass die offensichtliche Lösung weniger offen ist, als die anderen ganz offen zu tippen. - Matt
Nur damit du es weißt, .. und. sind keine Dateien. Sie sind Verweise auf Verzeichnisse. . (nur ein einzelner Punkt) ist das aktuelle Verzeichnis, und .. (zwei Punkte) ist eine Verbindung 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 nicht löschen. und ..(.?) - phuzion
Danke für den Kommentar Matt. Ich benutze den Befehl oft in Skripten mit dem Exit-Code pro Befehl (set -e). In diesen Fällen ist ein indikativer Exit-Code erforderlich. - Yonatan Broza
Es ist nichts inhärent in. und .. das schützt sie vor dem Löschen mit rm -rf. Dies ist nur ein Schutzmechanismus in modernen Variationen von RM hinzugefügt. - kubanczyk
Und es gibt immer rm -rf. * || true, wenn Sie nur das Set-e-Verhalten für diese eine Anweisung umgehen wollen. - Domingo Ignacio Galdos


Antworten:


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

Sollte alle Fälle erfassen. Das. ?? * * passt nur 3 + Zeichen Dateinamen (wie in der vorherigen Antwort erklärt), die. [^.] Fängt alle zwei Zeichen Einträge (anders als ..).


32
2017-07-30 08:58



Danke für die Antwort! Darauf aufbauend bin ich auch auf die kürzere Version von "rm -rf. [^.] *" Gekommen. - Yonatan Broza
Sei vorsichtig mit dieser kürzeren Version, es wird ähnliche, aber nicht identische Ergebnisse geben. Es werden keine Namen mit zwei Punkten an der Vorderseite übereinstimmen (z. B. "... /", was manchmal beim Verbergen von Rootkits usw. beobachtet wird). - Russell Heilling
Und sei vorsichtig, wenn du einen PWD-Check machst oder alle deine Einstellungen verlierst :) - kommradHomer
Das scheint nicht zu funktionieren zsh. Irgendwelche Vorschläge? - ryanjdillon
Mit zsh Standardmäßig wird eine leere Wildcard-Übereinstimmung als Fehler behandelt. während mit bash es wird einfach unverändert weitergegeben. Zu machen zsh verhalten sich genauso wie Sie den Befehl verwenden können unsetopt nomatch - Russell Heilling


find -path './.*' -delete

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

Für den Fall, dass Sie wirklich wischen wollten alles aus einem Verzeichnis, find -delete würde genügen.


1
2017-11-10 10:21



Dadurch wird alles gelöscht, nicht nur die Einträge, die mit beginnen . - kasperd
Oh, scheint, ich habe die Frage falsch verstanden als "alles löschen, einschließlich versteckter Dateien" ... Nun, mein Schlechter. - Fritz
@kasperd Danke, jetzt sollte es eigentlich die Frage beantworten. - Fritz


Der beste Weg ist wahrscheinlich:

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

Veränderung rm zu ls -l Wenn Sie nur sehen möchten, was gelöscht wird, um die Ausgabe zu beschreiben, die du hinzufügen möchtest -v Option zu rm

  • -Typ f Optionen sagt finden Befehl um nur nach Dateien zu suchen (Verzeichnisse weglassen, Links usw.)
  • -max Tiefe 1 erzählt finden nicht in Unterverzeichnisse zu gehen

ps. Vergiss nicht, '\;'


0
2017-09-14 15:26



Vorsichtig! Du meinst -iname '. *' Oder -iname. * Sonst wirst du hineinziehen. und .. schon wieder. - Domingo Ignacio Galdos


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.

-1
2017-08-04 11:35



Dies bricht sofort, wenn Sie eine Datei mit Leerzeichen in ihrem Namen haben. - α CVn