Então, estou usando uma combinação de find
e grep
para filtrar uma lista de nomes de arquivos de um documento de texto simples.
Aqui está o comando que executo:
find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt
Em arquivos.txt eu tenho isso:
/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
Quero que ele produza quaisquer linhas não correspondentes, mas em vez disso recebo o seguinte:
grep: invalid character range
Qual é a causa disso? Há muito mais em files.txt, apenas omiti porque seria muito longo. Eu também tenho vários caracteres Unicode. Isso poderia estar causando algum problema?
Mac OS X Yosemite, bash 3.2.57(1)-release, grep (BSD grep) 2.5.1-FreeBSD
Responder1
TLDR; adicionar-F
A -f
opção grep é usada para se referir a um arquivo que contém uma lista depadrões- seu arquivo não contém uma lista de padrões, contém uma lista de nomes de arquivos
homem grep
-f ARQUIVO, --file=ARQUIVO Obtenha padrões de ARQUIVO, um por linha. O arquivo vazio contém zero padrões e, portanto, não corresponde a nada. (-f é especificado por POSIX.)
Você precisa ter certeza de que todos os metacaracteres em seus nomes de arquivos tenham escape, a menos que você queira que eles sejam tratados como metacaracteres.
$ 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
Parece-me que seu files.txt provavelmente contém mais do que as quatro linhas que você mostra.
Verifique o arquivo usando
$ wc files.txt
4 21 221 files.txt
$ sum files.txt
43924 1
Em caso de dúvida, use a -F
opção (F maiúsculo) - mas você não escapa dos metacaracteres no arquivo.txt.
Observe o seguinte
$ 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
A -F
opção informa ao grep que seus padrões de pesquisa não contêm expressões regulares e que devem ser tratados como texto simples.