그래서 저는 일반 텍스트 문서에서 파일 이름 목록을 필터링하기 위해 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에는 더 많은 내용이 있습니다. 너무 길기 때문에 생략했습니다. 거기에도 여러 개의 유니코드 문자가 있습니다. 그게 문제를 일으킬 수 있나요?
Mac OS X Yosemite, bash 3.2.57(1)-릴리스, grep(BSD grep) 2.5.1-FreeBSD
답변1
TLDR; 추가하다-F
grep 옵션 -f
은 다음 목록이 포함된 파일을 참조하는 데 사용됩니다.패턴- 파일에 패턴 목록이 포함되어 있지 않지만 파일 이름 목록이 포함되어 있습니다.
남자 grep
-f FILE, --file=FILE FILE에서 한 줄에 하나씩 패턴을 가져옵니다. 빈 파일에는 패턴이 0개 포함되어 있으므로 일치하는 항목이 없습니다. (-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에 표시된 4줄보다 더 많은 내용이 포함되어 있을 것 같습니다.
다음을 사용하여 파일을 확인하십시오.
$ 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에 지시합니다.