查找:路径必须在表达式之前:如何指定递归搜索,同时查找当前目录中的文件?

我很难让找到在当前目录及其子目录中查找匹配。

当我运行find *test.c时,它只给我当前目录中的匹配项。(不查看子目录)

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

这个错误是什么意思,如何从当前目录及其子目录中获得匹配?

301812 次浏览

试着把它放在引号里:

find . -name '*test.c'

试着把它放在引号里——你遇到了shell的通配符展开,所以你实际传递给find的东西看起来像这样:

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

...导致语法错误。所以试试这个吧:

find . -name '*test.c'

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

实际情况是shell将“*test.c”展开为一个文件列表。尝试转义星号为:

find . -name \*test.c

从查找手册:

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

在我的情况下,我错过了跟踪路径/

find /var/opt/gitlab/backups/ -name *.tar

当我试图找到多个文件名时,我遇到了这个问题,我不能组合成一个正则表达式,正如@Chris J的回答所描述的那样,下面是对我有用的方法

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

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

我在CygWin上运行这个。

看来这个问题已经有答案了。我只是想分享对我有用的东西。我在(-name之间缺少一个空格。因此,选择一个文件排除其中一些的正确方法如下所示;

find . -name 'my-file-*' -type f -not \( -name 'my-file-1.2.0.jar' -or -name 'my-file.jar' \)

你可以试试这个:

cat $(file $( find . -readable) | grep ASCII | tr ":" " " | awk '{print $1}')

这样,您就可以用ASCII找到所有可读的文件,并使用cat读取它们

如果你想指定他的权重和不可执行的:

cat $(file $( find . -readable ! -executable -size 1033c) | grep ASCII | tr ":" " " | awk '{print $1}')