Daher verwende ich eine Kombination aus find
und, grep
um eine Liste von Dateinamen aus einem einfachen Textdokument herauszufiltern.
Hier ist der Befehl, den ich ausführe:
find /Volumes/Documents\ -\ Part\ 1/July 2009 -type f | grep -vf files.txt
In files.txt habe ich Folgendes:
/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
Ich möchte, dass alle nicht übereinstimmenden Zeilen ausgegeben werden, stattdessen erhalte ich jedoch Folgendes:
grep: invalid character range
Was ist die Ursache dafür? files.txt enthält noch viel mehr, ich habe es einfach weggelassen, weil es zu lang wäre. Es sind auch mehrere Unicode-Zeichen darin. Könnte das Probleme verursachen?
Mac OS X Yosemite, Bash 3.2.57(1)-Version, grep (BSD grep) 2.5.1-FreeBSD
Antwort1
TLDR; hinzufügen-F
Mit der -f
Option grep wird auf eine Datei verwiesen, die eine Liste vonMuster- Ihre Datei enthält keine Liste von Mustern, sondern eine Liste von Dateinamen
Mann grep
-f DATEI, --file=DATEI Muster aus DATEI abrufen, eins pro Zeile. Die leere Datei enthält null Muster und stimmt daher mit nichts überein. (-f wird von POSIX angegeben.)
Sie müssen sicherstellen, dass alle Metazeichen in Ihren Dateinamen maskiert werden, es sei denn, Sie möchten, dass sie als Metazeichen behandelt werden.
$ 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
Mir scheint, dass Ihre Datei „files.txt“ wahrscheinlich mehr als die vier Zeilen enthält, die Sie anzeigen.
Überprüfen Sie die Datei mit
$ wc files.txt
4 21 221 files.txt
$ sum files.txt
43924 1
Im Zweifelsfall verwenden Sie die -F
Option (Großbuchstabe F) – Sie maskieren dann jedoch keine Metazeichen in der Datei.txt.
Beachte das Folgende
$ 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
Die -F
Option teilt grep mit, dass Ihre Suchmuster keine regulären Ausdrücke enthalten und dass sie als einfacher Text behandelt werden sollen.