GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwenden Sie Suchen, um ein bestimmtes Verzeichnis zu finden und alle darin enthaltenen Dateien außer einem Verzeichnis zu löschen?

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/ .


Linux
  1. Alle Dateien außer in einem bestimmten Unterverzeichnis löschen mit Suchen?

  2. Verschieben Sie alle Dateien bis auf eine

  3. So erhalten Sie alle Dateien, die eine bestimmte Größe überschreiten, und löschen sie

  4. Befehl zum Auflisten aller Dateien außer . (Punkt) und .. (Punkt Punkt)

  5. Löschen Sie übereinstimmende Dateien in allen Unterverzeichnissen

So finden Sie die Anzahl der Dateien in einem Verzeichnis und Unterverzeichnissen

So finden und löschen Sie doppelte Dateien in Linux

Älteste Datei finden und löschen, wenn mehr als X Dateien in einem Verzeichnis in Linux vorhanden sind

Finden Sie alle Null-Byte-Dateien in Verzeichnissen und Unterverzeichnissen

Können Sie die Berechtigung für alle Dateien außer einem Verzeichnis in Linux ändern?

Löschen Sie alle bis auf 1000 zufällige Dateien in einem Verzeichnis