grep says 'invalid character range'
Solution 1:
TLDR; add -F
The -f
option of grep is used to refer to a file that contains a list of patterns - your file does not contain a list of patterns it contains a list of filenames
man grep
-f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.)
You need to make sure any metacharacters in your filenames are escaped unless you want them to be treated as metacharacters.
$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages
$ echo a | grep -vf files.txt
a
It seems to me your files.txt probably contains more than the four lines you show.
Check the file using
$ wc files.txt
4 21 221 files.txt
$ sum files.txt
43924 1
If in doubt, use the -F
option (uppercase F) - but then you don't escape metacharacters in file.txt.
Note the following
$ cat files.txt
/Volumes/Documents - Part 1/July 2009/vacation.pdf
/Volumes/Documents - Part 1/July 2009/pie time!.jpg
/Volumes/Documents - Part 1/July 2009/Coding/Unix/sample.sh
/Volumes/Documents - Part 1/July 2009/trip-to-spain.pages
[z-a]
$ echo aaa | grep -vf files.txt
grep: Invalid range end
$ echo aaa | grep -Fvf files.txt
aaa
The -F
option tells grep that your search patterns contain no regular expressions and that it should treat them as plain text.