“查找:路径必须在表达式之前:”如何指定也可在当前目录中找到文件的递归搜索?


234

我很难找到,寻找当前目录及其子目录下的比赛,以及。

当我跑步 find *test.c,它只给我当前目录中的匹配项。(不在子目录中查找)

如果我尝试,find . -name *test.c我会期望得到相同的结果,但是相反,它只给我子目录中的匹配项。当工作目录中有应该匹配的文件时,它会给我:find: paths must precede expression: mytest.c

此错误是什么意思,如何从当前目录及其子目录中获取匹配项?


4
根据记录,findmsysgit除非你用引号括模式可能会引发此错误:find . -name "*test.c"。(以防您选择Windows find.exe而不是cmd而
不是

Answers:


392

尝试将其用引号引起来-您正在进入Shell的通配符扩展,因此您要通过的准确查找如下所示:

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

...导致语法错误。因此,请尝试以下操作:

find . -name '*test.c'

请注意文件表达式周围的单引号-这些引号将阻止shell(bash)扩展通配符。


15
举个例子,如果您这样做,您可以看到发生了什么echo *test.c……结果将不是回显扩展通配符,而是外壳本身。简单的教训是,如果您使用通配符,请引用文件规范:-)
Chris

感谢您帮助我解决这个问题。我尝试find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’在网上找到,并遇到“路径必须在表达之前”。问题是引号太“聪明”了。我重新键入了命令,导致引号被替换,并且它运行了。
Smandoli

2
由于某些原因,单引号对我不起作用。我必须使用双引号。¯\ _(ツ)_ /
¯– Planky

通配符搜索的单引号与Busybox&GNU一起使用find-如果使用通配符*.$variable,则需要双引号。
Stuart Cardall

@Planky:我在shell脚本文件中输入了:find,-name'write.lock',但是它有此错误消息。但是,如果我输入控制台,它就可以工作。有人知道为什么吗?
朱Chu

28

发生的事情是外壳程序将“ * test.c”扩展为文件列表。尝试将星号转义为:

find . -name \*test.c

#gitbash这是我在Windows上使用git bash的解决方案,即使引用了PATTERNfind . -name '*txt'
不同的本


13

从查找手册:

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

0

当我尝试查找无法按@Chris J的答案所述合并为正则表达式的多个文件名时遇到了这个问题,这对我有用

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

-o或是-or逻辑或。有关更多信息,请参见在Gnu.org上查找文件

我在CygWin上运行它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.