GNU/Linux >> Linux Esercitazione >  >> Linux

Eliminare tutti i file in una directory il cui nome non corrisponde a una riga in un elenco di file?

Ho una directory con oltre 1000 file. In un file di testo, ho circa 50 nomi di file, uno per riga. Vorrei eliminare tutti i file nella directory i cui nomi di file non corrispondono a una voce nell'elenco. Qual'è il miglior modo per farlo? Ho avviato uno script di shell, ma non sono riuscito a determinare il comando corretto per determinare che il nome del file è nell'elenco. Grazie.

Risposta accettata:

Mi rendo conto che qualsiasi domanda su come eliminare i file deve essere presa con grande attenzione.
La mia prima risposta è stata troppo frettolosa, non ho preso il fatto che l'elenco dei file potesse essere non valido per essere utilizzato con egrep. Ho modificato la risposta per ridurre tale rischio.

Dovrebbe funzionare per i file che non hanno spazio nel nome:

Per prima cosa ricostruisci il tuo elenco di file per assicurarti che corrisponda al nome esatto del file:

sed -e 's,^,^,' -e 's,$,$,'  filelist  > newfilelist 

costruisci i comandi rm

cd your_directory
ls | egrep -vf newfilelist   | xargs -n 1 echo rm  >  rmscript

Controlla se lo script rm è adatto a te (puoi farlo con "vim" o "less").
Quindi esegui l'azione :

sh -x rmscript

Se i file hanno spazi nel loro nome (se i file hanno il " nel nome non funzionerà) :

ls | egrep -vf newfilelist  | sed 's,^(.*)$,rm "1",' > rmscript

ovviamente la lista dei file non dovrebbe trovarsi nella stessa directory!

MODIFICATO :

L'elenco dei file di Nathan conteneva nomi che corrispondevano a tutti i file nella directory (come "html" corrisponde a "bob.html"). Quindi nulla è stato cancellato perché egrep -vf assorbito tutto il flusso. Ho aggiunto un comando per inserire un "^" e un "$" attorno a ciascun nome di file. Sono stato fortunato qui che l'elenco dei file di Nathan fosse corretto. Se fosse stato formattato DOS con righe terminate CR-LF o con spazi aggiuntivi, nessun file sarebbe stato conservato da egrep e tutto sarebbe stato cancellato.


Linux
  1. 3 modi per eliminare tutti i file in una directory tranne uno o pochi file con estensioni

  2. Come eliminare file e directory in Linux dalla riga di comando

  3. Come aprire o elencare tutti i file il cui nome corrisponde a due modelli in Bash?

  4. Elencare tutte le directory che non contengono un file con un nome file specificato?

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

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

Come eliminare tutti i file con un'estensione particolare in una cartella particolare?

Rimuove un collegamento simbolico a una directory

Come eliminare tutti i file in una directory tranne alcuni?

Elimina tutti i file casuali tranne 1000 in una directory

Come elencare tutti i file con solo il percorso del file arbitrario letto, ma nessun elenco di directory né sudo?