Як я можу рекурсивно копіювати певні файли в каталозі?


14

Я новачок у Linux та grep та намагаюся знайти свій шлях.

Використовуючи, find -name *.javaя можу знайти імена всіх файлів java у певному каталозі. Припустимо, я хочу підрахувати кількість разів fooу цих файлах, як би це зробити?

Я пробував такі речі, як:

grep -r "foo" *.java

та отримання відповідей, таких як:

grep:  *.java:  No such file or directory

Будь-які ідеї?



1
Вибачте, наступного разу я виглядатиму важче. Примітно, що питання були настільки схожі.
Ерік Вілсон

1
Назва 3512 могла бути набагато кращою. "Основне питання використання грепу" не говорить вам багато про власне питання. У нас, ймовірно, буде більше дуп, якщо це не виправлено.
Річард Хоскінс

1
@richardhoskins, виправлено.
Джон Т

Відповіді:


16
find . -name '*.java' | xargs grep <your pattern here>

5
А ще краще використовувати елементи, що закінчуються нулем, щоб ім'я файлу з пробілом у ньому не розбивалося на два назви файлів: find. -name '* .java' -тип f -print0 | xargs -0 grep <ваш візерунок тут>
CoverosGene

1
@CoverosGene: Ви можете використовувати параметр --replace для xargs, щоб обробити це - так: ... | xargs --замініть grep "{}" <pattern>
arathorn

велике спасибі, я знав, що повинна бути команда, яка робить те, що xargsробить.
Ерік Вілсон

6

Є інструмент, спеціально розроблений для такого типу потреби: ack .

ack - такий інструмент, як grep, спрямований на програмістів з великими деревами неоднорідного вихідного коду

Прочитайте також "Топ-10 причин використовувати ack замість grep". на сторінці ack .


1
Мех. Справжній інструмент Unix потребує рекурсивної назви, що посилається на його спадщину ... як abtg [ABTG's Better than Grep], або щось таке. АСК? Єдине, що добре подумати про це - це те, що у автора вдосконаленого NACK вже вибрано ім’я;)
Майкж

Однією з причин, що мені дуже подобається ack, є те, що ви можете вказати типи файлів. Наприклад, я за допомогою "ack --html <pattern>" одночасно шукає всі мої файли .html, .htm, .xhtml, .dhtml тощо.
Марк ван Лент

Ack майже замінив grep для мене.
Райан К. Томпсон,


0

знайти. -тип f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l


3
Ласкаво просимо до SuperUser! Ви побачите, що ваші відповіді привертають більше уваги, коли це стосується більш актуальних питань (це - з 2009 року) і коли ви пояснюєте, чому ваша відповідь краща за вже прийняту.
Ерік Вілсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.