Ho il seguente problema. Ho una struttura di directory e voglio eliminare tutto ciò che si trova all'interno di una directory denominata Caches
. Tutto dovrebbe essere eliminato tranne tutte le directory denominate Snapshots
. Non riesco a capire come farlo con trova o qualsiasi altro comando che conosco.
Il motivo per cui lo chiedo:su iOS ogni app ha la propria directory Caches. Questi a volte non vengono cancellati correttamente, a seconda dell'app. Con la soluzione a questa risposta, si sarebbe in grado di cancellare le cache su iOS e quindi ottimizzare lo spazio su disco, quando l'unità dei dispositivi è montata su un altro computer, ad es. con FUSIBILE (iExplorer).
Questo è quello che ho finora:
find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print
Questo restituisce qualcosa come:
./Library/Caches
Quando eseguo un ls ./Library/Caches
Vedo tutti i contenuti e gli Snapshots
directory, che voglio escludere perché alla fine voglio -delete
tutto tranne questo.
Voglio qualcosa del genere:
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
Risposta accettata:
find . -depth -print0 | perl -0lne '
if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'
Se il tuo find
non supporta -print0
, puoi sostituirlo con -exec printf '%s\0' {} +
.
L'idea è di stampare l'elenco dei file con terminazione NUL (poiché 0 è l'unico byte che non può verificarsi in un percorso di file) e utilizzare perl
's -n
con -0
opzione per eseguire del codice per ciascuno di quei nomi di file (con $_
impostato sul nome del file).
Con -depth
, i file vengono stampati prima della loro directory principale. Rimuoviamo solo file o directory (supponendo che siano vuoti, motivo per cui è importante elaborare l'elenco in depth
order) se il loro percorso contiene /Caches/
non seguito da /Snapshosts/
.