Я запускаю следующую команду, но она не выполняется рекурсивно:
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