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