Ich habe folgendes Problem. Ich habe eine Verzeichnisstruktur und möchte alles löschen, was sich in einem Verzeichnis namens Caches
befindet . Alles sollte gelöscht werden, außer allen Verzeichnissen mit dem Namen Snapshots
. Ich kann nicht herausfinden, wie ich das mit find machen soll oder irgendein anderer mir bekannter Befehl.
Der Grund, warum ich frage:Auf iOS hat jede App ihr eigenes Caches-Verzeichnis. Diese werden je nach App manchmal nicht richtig gelöscht. Mit der Lösung für diese Antwort wäre man in der Lage, Caches unter iOS zu löschen und somit den Speicherplatz zu optimieren, wenn das Laufwerk des Geräts auf einem anderen Computer gemountet wird, z. mit FUSE (iExplorer).
Das habe ich bisher:
find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print
Dies gibt etwas zurück wie:
./Library/Caches
Wenn ich ein ls ./Library/Caches
mache Ich sehe alle Inhalte und die Snapshots
Verzeichnis, das ich ausschließen möchte, weil ich letztendlich -delete
möchte alles außer diesem hier.
Ich möchte so etwas:
Before: After:
. .
├── a ├── a
│ ├── a │ ├── a
│ └── Caches │ └── Caches
│ ├── a │ └── a
│ │ └── Snapshots │ └── Snapshots
│ │ └── a │ └── a
│ ├── b └── b
│ │ └── a └── c
│ └── c
└── b
├── c
└── Caches
├── a
│ └── foo
│ └── a
└── b
└── a
Akzeptierte Antwort:
find . -depth -print0 | perl -0lne '
if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'
Wenn Ihr find
unterstützt -print0
nicht , können Sie es durch -exec printf '%s\0' {} +
ersetzen .
Die Idee ist, die Liste der Dateien NUL-terminiert auszugeben (da 0 das einzige Byte ist, das nicht in einem Dateipfad vorkommen kann) und perl
zu verwenden ist -n
mit -0
Option, um Code für jeden dieser Dateinamen auszuführen (mit $_
auf den Dateinamen setzen).
Mit -depth
, Dateien werden vor ihrem übergeordneten Verzeichnis gedruckt. Wir entfernen nur Dateien oder Verzeichnisse (vorausgesetzt, sie sind leer, weshalb es wichtig ist, die Liste in depth
zu verarbeiten Reihenfolge), wenn ihr Pfad /Caches/
enthält nicht gefolgt von /Snapshosts/
.