GNU/Linux >> Znalost Linux >  >> Linux

Použijte Najít k nalezení určitého adresáře a odstranění všech souborů v něm kromě jednoho adresáře?

Mám následující problém. Mám adresářovou strukturu a chci smazat vše, co je v adresáři s názvem Caches . Vše by mělo být smazáno kromě všech adresářů s názvem Snapshots . Nemohu přijít na to, jak to udělat pomocí najít nebo jakýkoli jiný příkaz, který znám.

Důvod, proč se ptám:V iOS má každá aplikace svůj vlastní adresář Caches. Ty se někdy v závislosti na aplikaci nevyčistí správně. S řešením této odpovědi by bylo možné vymazat mezipaměti na iOS, a tedy optimalizovat místo na disku, když je jednotka zařízení připojena k jinému počítači, např. pomocí FUSE (iExplorer).

Zatím mám toto:

find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print

Vrátí něco jako:

./Library/Caches

Když udělám ls ./Library/Caches Vidím veškerý obsah a Snapshots adresář, který chci vyloučit, protože nakonec chci -delete všechno kromě tohoto.

Chci něco takového:

  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

Přijatá odpověď:

find . -depth -print0 | perl -0lne '
  if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'

Pokud find nepodporuje -print0 , můžete jej nahradit -exec printf '%s\0' {} + .

Cílem je vytisknout seznam souborů ukončených NUL (protože 0 je jediný bajt, který se nemůže vyskytovat v cestě k souboru) a použít perl ‘s -n s -0 možnost spustit nějaký kód pro každý z těchto názvů souborů (s $_ nastavit na název souboru).

S -depth , soubory jsou vytištěny před jejich nadřazeným adresářem. Odstraňujeme pouze soubory nebo adresáře (za předpokladu, že jsou prázdné, a proto je důležité zpracovat seznam do depth order), pokud jejich cesta obsahuje /Caches/ nenásleduje /Snapshosts/ .


Linux
  1. Odstraňte soubory a adresáře podle jejich jmen. Žádný takový soubor nebo adresář?

  2. Přesuňte všechny soubory kromě jednoho

  3. Najděte všechny nulabajtové soubory v adresáři a podadresářích

  1. Příkaz pro výpis všech souborů kromě . (tečka) a .. (tečka tečka)

  2. Můžete změnit oprávnění ke všem souborům kromě jednoho adresáře v Linuxu?

  3. Jak odstranit všechny soubory v adresáři kromě některých?

  1. Jak zjistit počet souborů v adresáři a podadresářích

  2. Jak najít a zkopírovat určitý typ souborů z jednoho adresáře do druhého v Linuxu

  3. Smažte všechny soubory kromě 1000 náhodných souborů v adresáři