Я запускаю следующую команду, но она не выполняется рекурсивно:
find . -name *.java
Я знаю, что в текущем каталоге находятся файлы Java, но он выполняет find
только текущий каталог. Я использую OS X, 10.9.
Я запускаю следующую команду, но она не выполняется рекурсивно:
find . -name *.java
Я знаю, что в текущем каталоге находятся файлы Java, но он выполняет find
только текущий каталог. Я использую OS X, 10.9.
Ответы:
Проблема в том, что вы не указали свой -name
параметр. Сделайте это вместо этого:
find . -name '*.java'
объяснение
Без кавычек оболочка интерпретируется *.java
как шаблон глоба и расширяет его до любых имен файлов, соответствующих глобусу, прежде чем передать его find
. Таким образом, если бы вы имели, скажем, foo.java
в текущем каталоге, find
фактическая командная строка была бы:
find . -name foo.java
который, очевидно, будет перечислять файл только в текущем каталоге (если только у вас нет файлов с аналогичными именами ниже по дереву).
Заключение в кавычки предотвращает расширение глобуса и передает командную строку find
как есть.
Кстати, если глобус не соответствует (нет *.java
файлов в текущем каталоге), вы получите одно из двух вариантов поведения в зависимости от того, как настроена ваша оболочка для обработки глобусов, которые не совпадают (это определяется nullglob
параметром в Bash). , например):
find
(случайно, обратите внимание) будет демонстрировать правильное поведение.find
будет жаловаться на отсутствие аргумента -name
.У меня была похожая ситуация, когда я окружал значение -name в кавычках, но все еще не получал все хиты поиска, на которые я надеялся. Я предположил, что это было из-за символических ссылок и, конечно же, так и было. Если вы хотите заставить поиск искать по символическим ссылкам, вы можете изменить команду следующим образом:
find -L . -name '*.java'
-follow
является более читаемым синонимом -L
, если вы поместите его перед другими параметрами.
Избежать *
find . -name \*.java