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

65

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

find . -name *.java

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

user11498
источник
@Gilles: этот Q & A гораздо понятнее и менее локализован, чем обман - если один из них должен быть закрыт, то другой.
Златовласка

Ответы:

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'
gaoagong
источник
Симлинки тоже были моей проблемой. -followявляется более читаемым синонимом -L, если вы поместите его перед другими параметрами.
Нумен
0

Избежать *

find . -name \*.java
Стюарт Кардалл
источник