it-swarm.com.de

"find: path muss vor expression stehen:" Wie gebe ich eine rekursive Suche an, die auch Dateien im aktuellen Verzeichnis findet?

Es fällt mir schwer, find im aktuellen Verzeichnis und seinen Unterverzeichnissen nach Übereinstimmungen zu suchen.

Wenn ich find *test.c es gibt mir nur die Übereinstimmungen im aktuellen Verzeichnis. (sucht nicht in Unterverzeichnissen)

Wenn ich es versuche find . -name *test.c Ich würde dieselben Ergebnisse erwarten, aber stattdessen erhalte ich nur Übereinstimmungen, 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 aus dem aktuellen Verzeichnis und seinen Unterverzeichnissen abrufen?

220
Chris Finley

Versuchen Sie es in Anführungszeichen zu setzen - Sie stoßen auf die Platzhaltererweiterung der Shell, sodass das, was Sie aktuell suchen, wie folgt aussieht:

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

... was den Syntaxfehler verursacht. Also versuche dies stattdessen:

find . -name '*test.c'

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

369
Chris J

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

find . -name \*test.c
27
Jim Garrison

Versuchen Sie es in Anführungszeichen zu setzen:

find . -name '*test.c'
15
rkulla

Aus dem Find Manual:

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
10

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

-o oder -or ist logisches ODER. Weitere Informationen finden Sie unter Suchen von Dateien auf Gnu.org .

Ich habe dies auf CygWin ausgeführt.

0
HappyTown

In meinem Fall fehlte mir der nachgestellte / im Pfad.

find /var/opt/gitlab/backups/ -name *.tar
0
Vikash Singh