GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzare Trova per trovare una determinata directory ed eliminare tutti i file in essa contenuti tranne una directory?

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


Linux
  1. Elimina file e directory in base ai loro nomi. Nessun file o directory con questo nome?

  2. Come spostare (e sovrascrivere) tutti i file da una directory all'altra?

  3. Trova tutti i file a zero byte nella directory e nelle sottodirectory

  4. Comando per elencare tutti i file tranne . (punto) e .. (punto punto)

  5. Come eliminare tutti i file in una directory tranne alcuni?

Come trovare ed eliminare file duplicati in Linux

Trova ed elimina il file più vecchio se ci sono più di X file in una directory in Linux

Come ottenere tutti i file che superano determinate dimensioni ed eliminarli

Elimina i file corrispondenti in tutte le sottodirectory

Puoi cambiare l'autorizzazione a tutti i file tranne una directory in Linux?

Elimina tutti i file casuali tranne 1000 in una directory