"find: пути должны предшествовать выражению:" Как указать рекурсивный поиск, который также находит файлы в текущем каталоге?
Мне трудно найти find, чтобы искать совпадения в текущем каталоге, а также в его подкаталогах.
Когда я запускаю find *test.c
, он дает мне только совпадения в текущем каталоге. (не отображается в подкаталогах)
Если я попробую find . -name *test.c
, я ожидаю те же результаты, но вместо этого он дает мне только совпадения, которые находятся в подкаталоге. Когда есть файлы, которые должны совпадать в рабочем каталоге, это дает мне: find: paths must precede expression: mytest.c
Что означает эта ошибка, и как я могу получить совпадения как из текущего каталога, так и из его подкаталогов?
Ответы
Ответ 1
Попробуйте поместить его в кавычки - вы работаете с расширением подстановки оболочки, поэтому то, что вы на самом деле проходите, будет выглядеть следующим образом:
find . -name bobtest.c cattest.c snowtest.c
... вызывает синтаксическую ошибку. Поэтому попробуйте это:
find . -name '*test.c'
Обратите внимание на одинарные кавычки вокруг вашего выражения файла - это остановит оболочку (bash), расширяющую ваши подстановочные знаки.
Ответ 2
Что происходит, так это то, что оболочка расширяет "* test.c" в список файлов. Попробуйте избежать звездочки как:
find . -name \*test.c
Ответ 3
Попробуйте поместить его в кавычки:
find . -name '*test.c'
Ответ 4
Из руководства по поиску:
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
Ответ 5
В моем случае я пропустил трейлинг /
в пути.
find /var/opt/gitlab/backups/ -name *.tar
Ответ 6
Я столкнулся с этим вопросом, когда пытался найти несколько имен файлов, которые я не мог объединить в регулярное выражение, как описано в ответе @Chris J, вот что сработало для меня
find . -name one.pdf -o -name two.txt -o -name anotherone.jpg
-o
или -or
является логическим ИЛИ. См. Поиск файлов на Gnu.org для получения дополнительной информации.
Я запускал это на CygWin.