2015-09-02 19 views
6

Ho una directory (~/temp/) che contiene molti file e sottodirectory e, in alcune directory, potrebbe contenere altri file e sottodirectory. Inoltre, nella directory (~/temp/), contiene un file txt speciale con nome kept.txt, elenca alcuni file diretti e sottodirectory contenuti in ~/temp/, ora voglio eliminare tutti gli altri file e directory sotto ~/temp/ che non sono elencati in il file kept.txt, come farlo con un comando di shell, il più semplice è il migliore.Script shell: come eliminare tutti i file in una directory tranne quelli elencati in un file?

ad es.

La directory piace come di seguito:

$ tree temp/ -F 
temp/ 
├── a/ 
├── b/ 
├── c/ 
│   ├── f2.txt 
│   └── z/ 
├── f1.txt 
└── kept.txt 

Il contenuto di kept.txt è:

$ more kept.txt 
b 
kept.txt 

Per questo caso:

  1. voglio eliminare a/, c/ e f1.txt. Per c/, la directory stessa e tutto il contenuto secondario (file e directory) verranno eliminati.
  2. In kept.txt, il formato è un elemento (file o directory) per riga.

risposta

3

Usando extglob si può fare questo:

cd temp 
shopt -s extglob 

rm -rf !($(printf "%s|" $(<kept.txt))) 

printf "%s|" $(<kept.txt) fornirà uscita come b|kept.txt| e !(...) è un extended glob pattern negare la partita.

+0

Tranne che cancellerà anche 'kept.txt'. – cdarke

+0

No, non lo cancellerà perché OP ha anche la riga 'kept.txt' nel file' kept.txt'. – anubhava

+0

Mancato, mi dispiace. (era che na modifica?) – cdarke

1

Spostare tutto in una cartella temporanea. Spostare indietro i file/le directory elencati in .txt. Quindi, per ultimo, rimuovi la cartella temporanea.

+1

Sì, questo è un modo semplice per risolvere questo problema, ma non sono sicuro che ci sia qualche comando semplice per farlo. – manshou

Problemi correlati