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

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

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' 
  • Как сделать аргумент cd аргументов нечувствительным?
  • Хранение сценариев оболочки
  • Вход в систему с конкретной оболочкой при входе в терминал
  • Что означает «$ {x %% *}» в sh?
  • Запустить Comand для всех файлов (вложенных папок в папках)
  • Помогает ли родительский скрипт bash запомнить историю cd из сценария child bash?
  • gunzip папку со многими файлами
  • Создать имя каталога на основе других других каталогов
  • Как я могу закончить здесь-документ, начинающийся с << \\ $ fff?
  • Может ли bash развернуть цитированную и / или экранированную строковую переменную в слова?
  • в чем разница между `find .` и / home / user / * в качестве входа для команды
  • Linux и Unix - лучшая ОС в мире.