Почему моя находка не рекурсивна?

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

find . -name *.java 

Я знаю, что в текущем каталоге есть java-файлы, но он выполняет find в текущем каталоге. Я использую OS X, 10.9.

2 Solutions collect form web for “Почему моя находка не рекурсивна?”

Проблема в том, что вы не -name параметр your -name . Сделайте это вместо этого:

 find . -name '*.java' 

объяснение

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

 find . -name foo.java 

который, очевидно, будет отображать файл только в текущем каталоге (если у вас не будет файлов с похожими именами далее по дереву).

Quoting предотвращает расширение glob и передает командную строку для find as-is.

Кстати, если glob не удалось сопоставить (нет *.java файлов в текущем каталоге), вы получите одно из двух вариантов поведения в зависимости от того, как настроена ваша оболочка для обработки несовместимых глобусов (это определяется опция nullglob в Bash, например):

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

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

 find -L . -name '*.java' 
  • Выполнение команды на удаленном хосте не выполняется
  • Расширение поиска истории в zsh
  • Отдельный экран на удаленном хосте
  • Добавление backtick (`) в вывод heredoc в команде оболочки
  • Почему это rm -rf, а не rmdir -rf
  • Как правильно запустить программу и сделать возможным перенаправить свой текущий выход (stdout и stderr) на более поздний этап?
  • По умолчанию umask для заданий cron
  • Как сделать переменную из подоболочки доступной в родительской оболочке
  • Как изменить рабочий каталог для сценария оболочки
  • Как получить чистую среду в оболочке ksh?
  • Что случилось с этой командой xargs?
  • Linux и Unix - лучшая ОС в мире.