Delete all files in a directory whose name do not match a line in a file list
I realize that any question asking how to delete files must be taken with great care. My first answer was too hasty I didn't take the fact that the filelist could be malformed to be used with egrep. I edited the answer to reduce that risk.
That should work for the files that has no space in the name:
First rebuild your filelist to be sure to match the exact file name:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
build the rm commands
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Check if the rm script suits you (You can do it with "vim" or "less").
Then perform the action :
sh -x rmscript
If the files have spaces in their name (if the files have the "
in the name then this will not work) :
ls | egrep -vf newfilelist | sed 's,^\(.*\)$,rm "\1",' > rmscript
of course the filelist should not be in the same directory!
EDITED :
The Nathan's file list contained names that were matching all the files in the directory (like "html" matches "bob.html"). So nothing was deleted because egrep -vf
absorbed all the stream. I added a command to put a "^" and a "$" around each file name. I was lucky here that Nathan's file list was correct. Would have it been DOS formatted with CR-LF ended lines or with additional spaces, no files would have been preserved by the egrep and all been deleted.