"Find: шляху повинні передувати виразу:" Як вказати рекурсивний пошук, який також знаходить файли в поточному каталозі?


235

Мені важко знайти пошуки відповідностей у поточному каталозі, а також у його підкаталогах.

Коли я запускаю, find *test.cце дає мені лише відповідність у поточному каталозі. (не шукає у підкаталогах)

Якщо я спробую, find . -name *test.cя очікував би однакових результатів, але натомість він дає мені лише відповідність, яка знаходиться у підкаталозі. Коли в робочому каталозі є файли, які повинні відповідати, це дає мені:find: paths must precede expression: mytest.c

Що означає ця помилка та як я можу отримати збіги як із поточного каталогу, так і з його підкаталогів?


4
для запису, findз msysgit може кинути цю помилку , якщо ви не оточувати шаблон в лапки: find . -name "*test.c". (У випадку, якщо ви вирішили віддати перевагу перед Windows ' find.exeі відрізнятись від cmd)
n611x007

Відповіді:


393

Спробуйте помістити це в лапки - ви перебуваєте в розширенні підстановки оболонки, тому те, що ви фактично переходите до пошуку, виглядатиме так:

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

... викликає помилку синтаксису. Тому спробуйте це замість цього:

find . -name '*test.c'

Зверніть увагу на одиничні лапки навколо виразу вашого файлу - вони зупинять розширення оболонки (bash) ваших підстановок.


15
На прикладі ви можете побачити, що відбувається, якщо ви зробите echo *test.c... результат буде не відлунням розширення підстановки, а самою оболонкою. Простий урок - якщо ви користуєтеся символами, цитуйте filepec :-)
Chris J

Дякуємо, що допомогли мені у цьому ВАРІАНТІ. Я спробував, find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’як знайдено в Інтернеті, і мені зустріли "шляхи повинні передувати вираженню". Проблема полягала в тому, що лапки були занадто "розумні". Я повторно вписав команду, в результаті чого лапки було замінено, і вона запустилася.
Смандолі

2
Чомусь окремі цитати не спрацювали для мене. Довелося використовувати подвійні лапки. ¯ \ _ (ツ) _ / ¯
Планки

Одиночні котирування для пошуку в wildcard, що працюють з Busybox & GNU find- якщо ви використовуєте підстановку, *.$variableвам потрібні подвійні лапки.
Стюарт Кардалл

@Planky: Я поміщаю: find, -name 'write.lock' у файл скрипту оболонки, але в ньому є повідомлення про помилку. Але якщо я набираю консоль, вона працює. Хтось знає, чому?
Скотт Чу

28

Що відбувається, це те, що оболонка розширює "* test.c" у список файлів. Спробуйте уникнути зірочки як:

find . -name \*test.c

#gitbash це було рішення для мене з git bash на windows, навіть коли цитується 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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.