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