I have a directory with 1000+ files. In a text file, I have about 50 filenames, one per line. I'd like to delete all the files in the directory whose filenames don't correspond with an entry on the list. What's the best way to do this? I started a shell script, but couldn't determine the proper command to determine in the filename is on the list. Thanks.
Files – Delete All Files in a Directory Not Matching a Line in a File List
filesfind
Best Answer
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:
build the rm commands
Check if the rm script suits you (You can do it with "vim" or "less").
Then perform the action :
If the files have spaces in their name (if the files have the
"
in the name then this will not work) :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.