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