Чому моя знахідка не є рекурсивною?


65

Я виконую наступну команду, але вона не виконується рекурсивно:

find . -name *.java

Я знаю, що в поточному каталозі є файли java, але він працює лише findв поточному каталозі. Я використовую OS X, 10.9.


@Gilles: Ця запитання набагато чіткіше і менш локалізована, ніж дупа - якщо одну з них слід закрити, це інша.
goldilocks

Відповіді:


88

Проблема в тому, що ви не вказали свій -nameпараметр. Зробіть це замість цього:

find . -name '*.java'

Пояснення

Без лапок оболонка інтерпретується *.javaяк шаблон глобуса і розширює його на будь-які імена файлів, що відповідають глобулю, перш ніж передавати його find. Таким чином, якби ви були, скажімо, foo.javaу поточному каталозі, findфактичним командним рядком було б:

find . -name foo.java

який, очевидно, перелічить файл лише в поточному каталозі (якщо у вас не буде деяких файлів з подібним іменем далі по дереву).

Цитування перешкоджає розширенню глобальної версії та передає командний рядок findяк є.

Між іншим, якби глобус не зміг збігтися ( *.javaфайлів у поточному каталозі немає), ви отримаєте одне з двох способів поведінки залежно від того, як ваша оболонка налаштована на обробку глобусів, які не відповідають (це регулюється nullglobопцією в Bash , наприклад):

  1. Якщо глобус, який не відповідає, не розширюється оболонкою, findвін (випадково зауважив) проявлятиме правильну поведінку.
  2. Якщо глобус, який не відповідає, розгорнеться оболонкою на порожній рядок, findпоскаржиться, що йому не вистачає аргументу -name.

20

У мене була ситуація, схожа на те, що я оточував значення -name в лапках, але все одно не отримував усіх знайдених хітів, на які я сподівався. Я здогадувався, що це було через символьні посилання та досить впевнені, що це було так. Якщо ви хочете змусити пошук знайти за допомогою посилань, ви можете змінити команду на наступне:

find -L . -name '*.java'

Символьні посилання теж були моєю проблемою. -followє більш читаним синонімом -L, якщо ви ставите його перед іншими парамами.
Номенон

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