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.