Поэтому я использую комбинацию find и grep для фильтрации списка имен файлов из простого текстового документа.

Вот команда, которую я запускаю:

find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt

В файлах .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 есть намного больше, я просто опустил его, потому что он будет слишком длинным. У меня там тоже есть несколько символов Юникода. Может ли это быть причиной каких-либо проблем?

Mac OS X Yosemite, bash 3.2.57(1) -релиз, grep (BSD grep) 2.5.1-FreeBSD

1 ответ1

0

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, что ваши шаблоны поиска не содержат регулярных выражений и что они должны обрабатывать их как обычный текст.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .