Використання "find" для декількох розширень файлів


16

Я використовую таку команду для підрахунку рядків тексту у файлах JAVA:

find . -name '*.java' | xargs wc -l

Як я можу змінити findпараметри команди, щоб відповідати більше ніж одне розширення файлу? Наприклад, я хотів би використати вищезазначені операції для файлів CPP, C та H.


Це питання насправді стосується findкоманди, оскільки саме там ви шукаєте відповідні файли.
iglvzx

1
Крім того , використовувати або find -print0 | xargs -0конструкцію або навіть краще і простіше: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Це дозволить уникнути будь-яких проблем з іменем файлу (порожні пробіли, нові рядки тощо) і є (дуже) хорошим звичаєм.
Даніель Андерссон

Відповіді:


16

Використовуйте -oопцію для АБО. Наприклад, цей список буде .cpp, .cі .hфайли:

find . -name \*.cpp -o -name \*.c -o -name \*.h

Ага. Більше *не потрібно уникати, якщо їх відформатувати як код. Повністю проігнорував це. :)
iglvzx

Так, дві людини змінилися три зміни, але ми це отримали.
JOTN

2
Це не спрацювало для мене на OSX (збігалося лише з прізвищем * .ext) - мені довелося використовувати дужки, як запропонував @smokinguns нижче.
Гілеад

2

Вам потрібно буде скористатися опцією -o. Наприклад, наведене нижче твердження знаходить усі файли png, jpg та gif у папці.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Я використовую варіант -iname, щоб збіг не залежав від регістру.


1
iname доступний не у всіх версіях пошуку.
JOTN


1

Хоча всі відповіді більш-менш однакові, я не вважаю їх читабельними з кількома іменами та булевими операторами між ними.

Я думаю, що це може бути більш елегантним рішенням:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Давайте розберемо це

  • find . знаходить усі файли рекурсивно в поточному шляху (якщо потрібно, змініть на інший шлях)
  • -type fзвужує пошук лише до файлів (не надто багато швидкості, але все ж ...)
  • | grep -EЯ використовував це , щоб отримати Grep визнати або ( |) оператор в Mac OS X , яка використовує FreeBSD Grep , GNU Grep не потребує в тому , що (перевірка в вашому manфайлі).
  • "\.java$|\.cpp$|\.c$"регулярний вираз , яке включає в себе файли, імена яких закінчуються з .java, .cppі .c(додати в них вам потрібно)

Потім можна передати отриманий список для подальшої обробки, наприклад

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Цей приклад видаляє CRLFрядок DOS / Windows, що закінчується для OS X / Linux LF(це також sedсинтаксис OS X , перевірте специфіку вашої версії).


Я хотів знайти всі типи відеофайлів, використовуючи 25 різних параметрів відповідності розширень. Це був єдиний підхід, який працював на мене. (Ubuntu 14.04 LTS)
Старійшина Гік

0

Використовуйте

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Пояснення

  1. Перший параметр - це каталог, який ви хочете шукати.
  2. За замовчуванням findвідбувається рекурсія.
  3. -oЧи означає -or. Отже, вище означає пошук цієї підстановки АБО цього. Якщо у вас є лише один зразок, тоді не потрібно -o.
  4. Цитати навколо шаблону підстановки обов'язкові.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.