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.