"Find: Pfade müssen vor dem Ausdruck stehen:" Wie gebe ich eine rekursive Suche an, die auch Dateien im aktuellen Verzeichnis findet?

234

Ich habe eine harte Zeit, finden für die Spiele im aktuellen Verzeichnis zu sehen sowie dessen Unterverzeichnisse.

Wenn ich find *test.cstarte, werden mir nur die Übereinstimmungen im aktuellen Verzeichnis angezeigt. (schaut nicht in Unterverzeichnisse)

Wenn ich es versuche, find . -name *test.cwürde ich die gleichen Ergebnisse erwarten, aber stattdessen werden nur Übereinstimmungen angezeigt, die sich in einem Unterverzeichnis befinden. Wenn es Dateien gibt, die im Arbeitsverzeichnis übereinstimmen sollten, gibt es mir:find: paths must precede expression: mytest.c

Was bedeutet dieser Fehler und wie kann ich die Übereinstimmungen sowohl aus dem aktuellen Verzeichnis als auch aus seinen Unterverzeichnissen abrufen?

Chris Finley
quelle
4
für die Aufzeichnung, findvon msysgit kann diesen Fehler auslösen , wenn Sie das Muster mit Anführungszeichen: find . -name "*test.c". (Falls Sie es Windows vorziehen, find.exedas sich von
cmd

Antworten:

392

Versuchen Sie es in Anführungszeichen zu setzen - Sie stoßen auf die Wildcard-Erweiterung der Shell. Das, was Sie tatsächlich suchen, sieht also so aus:

find . -name bobtest.c cattest.c snowtest.c

... den Syntaxfehler verursachen. Versuchen Sie dies stattdessen:

find . -name '*test.c'

Beachten Sie die einfachen Anführungszeichen um Ihren Dateiausdruck - diese verhindern, dass die Shell (Bash) Ihre Platzhalter erweitert.

Chris J.
quelle
15
Sie können beispielsweise sehen, was passiert, wenn Sie dies tun echo *test.c. Das Ergebnis ist kein Echo, das den Platzhalter erweitert, sondern die Shell selbst. Die einfache Lektion ist, wenn Sie Platzhalter verwenden, zitieren Sie die Dateispezifikation :-)
Chris J
Danke, dass du mir bei dieser VARIANT geholfen hast. Ich habe versucht, find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’wie im Web gefunden, und wurde mit "Pfade müssen Ausdruck vorausgehen" getroffen. Problem war, dass die Anführungszeichen zu "klug" waren. Ich habe den Befehl erneut eingegeben, wodurch die Anführungszeichen ersetzt wurden, und er wurde ausgeführt.
Smandoli
2
Aus irgendeinem Grund haben einfache Anführungszeichen bei mir nicht funktioniert. Ich musste doppelte Anführungszeichen verwenden. ¯ \ _ (ツ) _ / ¯
Planky
einfache Anführungszeichen für Platzhaltersuchen, die mit Busybox & GNU funktioniert haben find- wenn Sie einen Platzhalter verwenden *.$variable, benötigen Sie doppelte Anführungszeichen.
Stuart Cardall
@ Planky: Ich habe: find, -name 'write.lock' in die Shell-Skriptdatei eingefügt, aber es hat diese Fehlermeldung. Aber wenn ich die Konsole eingebe, funktioniert es. Weiß jemand warum?
Scott Chu
28

Was passiert ist, dass die Shell "* test.c" in eine Liste von Dateien erweitert. Versuchen Sie, dem Sternchen wie folgt zu entkommen:

find . -name \*test.c
Jim Garrison
quelle
#gitbash Dies war die Lösung für mich mit Git Bash auf Windows, auch wenn ich das MUSTER zitierefind . -name '*txt'
ein anderer Ben
17

Versuchen Sie es in Anführungszeichen zu setzen:

find . -name '*test.c'
rkulla
quelle
13

Aus dem Suchhandbuch:

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print
Nick Constantine
quelle
0

Ich bin auf diese Frage gestoßen, als ich versucht habe, mehrere Dateinamen zu finden, die ich nicht zu einem regulären Ausdruck kombinieren konnte, wie in der Antwort von @Chris J beschrieben. Hier ist, was für mich funktioniert hat

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-ooder -orist logisch ODER. Weitere Informationen finden Sie unter Suchen von Dateien auf Gnu.org .

Ich habe das auf CygWin ausgeführt.

Glückliche Stadt
quelle
-1

In meinem Fall fehlte mir das Nachlaufen /.

find /var/opt/gitlab/backups/ -name *.tar
Vikash Singh
quelle
1
Ein Trailing /ist nicht erforderlich.
Melpomene