Поэтому я использую комбинацию find
и grep
для фильтрации списка имен файлов из простого текстового документа.
Вот команда, которую я запускаю:
find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt
В 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
Я хочу, чтобы он выводил все несовпадающие строки, но вместо этого получаю это:
grep: invalid character range
В чем причина? В files.txt есть еще много чего, я просто опустил это, потому что это было бы слишком долго. У меня там тоже есть несколько символов unicode. Может ли это вызывать какие-либо проблемы?
Mac OS X Yosemite, bash 3.2.57(1)-релиз, grep (BSD grep) 2.5.1-FreeBSD
решение1
TLDR; добавить-F
Параметр -f
grep используется для ссылки на файл, содержащий списокузоры- ваш файл не содержит список шаблонов, он содержит список имен файлов
человек grep
-f ФАЙЛ, --file=ФАЙЛ Получить шаблоны из ФАЙЛА, по одному на строку. Пустой файл не содержит ни одного шаблона и, следовательно, не соответствует ничему. (-f указано в POSIX.)
Вам необходимо убедиться, что все метасимволы в именах файлов экранированы, если вы не хотите, чтобы они рассматривались как метасимволы.
$ 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
Мне кажется, что ваш файл files.txt, вероятно, содержит больше, чем четыре строки, которые вы показываете.
Проверьте файл с помощью
$ wc files.txt
4 21 221 files.txt
$ sum files.txt
43924 1
Если сомневаетесь, используйте -F
опцию (заглавная буква F) — но тогда вы не экранируете метасимволы в file.txt.
Обратите внимание на следующее
$ 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
Эта -F
опция сообщает grep, что ваши шаблоны поиска не содержат регулярных выражений и что их следует обрабатывать как обычный текст.