Як я можу дозволити `find` ігнорувати .svn каталоги?


227

Я часто використовую findкоманду для пошуку вихідного коду, видалення файлів, будь-чого. Прикро, тому що Subversion зберігає дублікати кожного файлу у своїх .svn/text-base/каталогах, мої прості пошуки в кінцевому підсумку отримують багато повторюваних результатів. Наприклад, я хочу рекурсивно шукати uintв кількох messages.hі messages.cppфайлах:

# find -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./.svn/text-base/messages.cpp.svn-base:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./.svn/text-base/messages.cpp.svn-base:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./.svn/text-base/messages.cpp.svn-base:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;
./virus/.svn/text-base/messages.cpp.svn-base:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.cpp.svn-base:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/.svn/text-base/messages.h.svn-base:    void _progress(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/.svn/text-base/messages.h.svn-base:    uint        _scanCount;

Як я можу сказати findігнорувати .svnкаталоги?


Оновлення : Якщо ви оновите клієнт SVN до версії 1.7, це більше не є проблемою.

Ключовою особливістю змін, внесених у Subversion 1.7, є централізація зберігання метаданих робочої копії в одне місце. Замість .svnкаталогу в кожному каталозі робочої копії Subversion 1.7 робочі копії мають лише один .svnкаталог - у корені робочої копії. Цей каталог включає (серед іншого) базується на SQLite базі даних, яка містить усі необхідні метадані Subversion для цієї робочої копії.


4
Для продуктивності спробуйте використовувати find ... -print0 | xargs -0 egrep ...замість find ... -exec grep ...(не вилка grepдля кожного файлу, а для групи файлів одночасно). За допомогою цієї форми ви також можете обрізати .svnкаталоги, не використовуючи -pruneопцію пошуку, тобтоfind ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
vladr

3
@Vlad: Наскільки я знаю, використання -execз +не fork grepдля кожного файлу, тоді як використовуючи його з ;do. Використання -execнасправді правильніше, ніж використання xargs. Зауважте, що команди, як-от, lsроблять щось, навіть якщо список аргументів порожній, тоді як команди на зразок chmodдають помилку, якщо аргументів недостатньо. Для того, щоб побачити , що я маю в виду, просто спробуйте наступну команду в каталозі , який не має будь - яких скрипт: find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755. Порівняйте з цим: find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: Крім того, grep-ing out теж .svnне є хорошою ідеєю. Хоча findспеціалізується на обробці властивостей файлів, grepце не так. У вашому прикладі файл з назвою ".svn.txt" також буде відфільтрований вашою egrepкомандою. Хоча ви можете змінити свій регулярний вираз на "^ / \. Svn $" , це все ще не є хорошою практикою. -pruneПредикат findвідмінно працює для фільтрації файлів (по імені файлу, або створення тимчасової мітки, або незалежно від стану ви додається). Це так само, як навіть якщо ви можете вбити таргана великим мечем, не означає, що це запропонований спосіб зробити це :-).
Siu Ching Pong -Asuka Kenji-

3
Перехід на Git вирішив цю проблему (серед багатьох інших). У лише створюється .git папка в корені робочої копії, а не в кожній папці, як SVN. Крім того, папка .git не містить простих файлів, які б переплутані з вашими фактичними файлами однаковими іменами.
Tronic

3
2Dan Molding: svn 1.7 створює єдину єдину версію .svn каталогу
ccpizza

Відповіді:


65

Для пошуку я можу запропонувати вам поглянути на ack ? Він знає вихідний код findі, як такий, автоматично ігнорує багато типів файлів, включаючи інформацію сховища вихідного коду, як описано вище.


3
Мені це ackдуже подобається , але я виявив, що це значно повільніше, ніж find -type f -name "*.[ch]" | xargs grepпри роботі з великою базою кодів.
Джон Ледбеттер

63
Джон, я є автором акка, і якщо ти можеш розповісти мені про швидкісні проблеми Ack vs. grep, я би вдячний. Вони були абсолютно порівнянні у всіх знайдених нами випадках. Або повідомте мене на сайті github.com/petdance/ack/isissue або надішліть мені електронний лист на адресу Енді на сайті petdance.com. Танськ.
Енді Лестер

63
Хлопці, ось підказка, але точно не відповідь на питання! :)
dolzenko

8
Чи не ackвиставляється рахунок, як кращий grep, а не джерело find? Деякі приклади використання його для заміни findперетворили б це на справжню відповідь.
michiakig

3
Це відповідь на питання, яке він не знав, що задає. =)
Фрунгі

293

чому не просто

find . -not -iwholename '*.svn*'

Присудок -not нівелює все, що має .svn в будь-якому місці шляху.

Так у вашому випадку було б

find -not -iwholename '*.svn*' -name 'messages.*' -exec grep -Iw uint {} + \;

5
Супер великий +1 для "-not" та "-iwholename". Ack чудовий, і я його використовую, але find / exec все ще має свої можливості.
Девід Блевінс

9
Єдина відповідь, яка насправді відповіла на початкове запитання.
Брендон Крофорд

14
Я виходжу зі свого елемента, і я впевнений, що мене будуть критикувати за цей коментар, але, мабуть, - ні і-ім'я імені не відповідають POSIX. Я використав ! замість -но і -путь замість -і ім’я і отримали однакові результати. Відповідно до моїх сторінок man (Ubuntu 12.04), цей синтаксис сумісний з POSIX.
Іван

1
@whaley Ви сказали '*.svn*'спочатку, але потім '*.svn'. Що правильно? Чи працюють обоє? Я думаю, це, мабуть, має бути '*.svn*'?
Кіт М

1
@KeithM чудовий улов насправді. Ця відповідь сидить тут протягом багатьох років, і я не думаю, що ніхто досі цього не зловив.
кит

141

Так:

find . -path '*/.svn*' -prune -o -print

Або, базуючись на каталозі, а не на префіксі шляху:

find . -name .svn -a -type d -prune -o -print

14
@Kaleb: Привіт. Я пропоную, find . -type d -name .svn -prune -o -printтому що це трохи швидше. Відповідно до стандарту POSIX , вирази оцінюються по черзі у визначеному порядку. Якщо перший вираз -aє false, другий вираз не буде оцінено (його також називають коротким замиканням та оцінкою ).
Сіу Чінг Понг -Asuka Kenji-

2
@Kaleb: Якщо порівняння типу файлу (еквівалентно тестуванню, чи встановлено біт у цілому цілому), швидше, ніж порівняння імені файлу (еквівалентно порівнянню рядків, яке є O (n)), ставити -type dперед цим -name .svnтеоретично більш ефективно. Однак зазвичай це незначно, за винятком випадків, коли у вас дуже велике дерево каталогів.
Siu Ching Pong -Asuka Kenji-

5
@ SiuChingPong-AsukaKenji- ні, порівняння лише імені файлів швидше, оскільки -type вимагає статичного (2) виклику в кожному файлі. Однак ім'я файлу є частиною відповіді readdir (3).
hraban

3
@JonathanHartley Вам не вистачає -printчастини як останнього виразу. Щось на кшталт find . -name .git -prune -o \( -type f -name LICENSE -print \)роботи, як очікувалося.
sschuberth

1
Якщо ви хочете ігнорувати як .git і .svn і просто перерахувати інші каталоги, find . -name .svn -prune -o -name .git -prune -o -type d -print. Це може бути на кілька мілісекунд швидше ставити -type dперед двома -name, але це не варто додаткового набору тексту.
JPaget

34

Для того, щоб ігнорувати .svn, .gitі інші приховані каталоги (починаються з точки), спробуйте:

find . -type f -not -path '*/\.*'

Однак якщо метою використання findє пошук у файлах, ви можете спробувати використовувати ці команди:

  • git grep - спеціально розроблена команда для пошуку шаблонів у сховищі Git.
  • ripgrep- який за замовчуванням ігнорує приховані файли та файли, вказані в .gitignore.

Пов'язано: Як знайти всі файли, що містять певний текст у Linux?


Найкраща відповідь imo. Інші намагаються пояснити речі, які не відповідають на просте запитання.
Ентоні

19

Ось що я зробив би у вашому випадку:

find . -path .svn -prune -o -name messages.* -exec grep -Iw uint {} +

rgrepВбудована команда Emacs ігнорує .svnкаталог та багато інших файлів, які, напевно, не цікавлять вас під час виконання find | grep. Ось що воно використовується за замовчуванням:

find . \( -path \*/SCCS -o -path \*/RCS -o -path \*/CVS -o -path \*/MCVS \
          -o -path \*/.svn -o -path \*/.git -o -path \*/.hg -o -path \*/.bzr \
          -o -path \*/_MTN -o -path \*/_darcs -o -path \*/\{arch\} \) \
     -prune -o \
       \( -name .\#\* -o -name \*.o -o -name \*\~ -o -name \*.bin -o -name \*.lbin \
          -o -name \*.so -o -name \*.a -o -name \*.ln -o -name \*.blg \
          -o -name \*.bbl -o -name \*.elc -o -name \*.lof -o -name \*.glo \
          -o -name \*.idx -o -name \*.lot -o -name \*.fmt -o -name \*.tfm \
          -o -name \*.class -o -name \*.fas -o -name \*.lib -o -name \*.mem \
          -o -name \*.x86f -o -name \*.sparcf -o -name \*.fasl -o -name \*.ufsl \
          -o -name \*.fsl -o -name \*.dxl -o -name \*.pfsl -o -name \*.dfsl \
          -o -name \*.p64fsl -o -name \*.d64fsl -o -name \*.dx64fsl -o -name \*.lo \
          -o -name \*.la -o -name \*.gmo -o -name \*.mo -o -name \*.toc \
          -o -name \*.aux -o -name \*.cp -o -name \*.fn -o -name \*.ky \
          -o -name \*.pg -o -name \*.tp -o -name \*.vr -o -name \*.cps \
          -o -name \*.fns -o -name \*.kys -o -name \*.pgs -o -name \*.tps \
          -o -name \*.vrs -o -name \*.pyc -o -name \*.pyo \) \
     -prune -o \
     -type f \( -name pattern \) -print0 \
     | xargs -0 -e grep -i -nH -e regex

Він ігнорує каталоги, створені більшістю систем управління версіями, а також генеровані файли для багатьох мов програмування. Ви можете створити псевдонім, який викликає цю команду та замінить findі grepзразки для ваших конкретних проблем.


12

GNU знайти

find .  ! -regex ".*[/]\.svn[/]?.*"

Я завантажував контури каталогів у масив для обробки PHP. Інші відповіді вище (з будь-якої причини) не відфільтрували файли у знаходженні (незважаючи на -type d) - ця відповідь зробила. +1
бути холленбеком

11

Для цього я використовую grep. Помістіть це у своєму ~ / .bashrc

export GREP_OPTIONS="--binary-files=without-match --color=auto --devices=skip --exclude-dir=CVS --exclude-dir=.libs --exclude-dir=.deps --exclude-dir=.svn"

grep автоматично використовує ці параметри при виклику


1
Варто зазначити, що "grep" отримав лише опцію "--exclude-dir" рік-два тому. Останні дистрибутиви Linux включають його, але якщо я правильно пам’ятаю, мені довелося скласти власний греп (або попросити домашню мову зробити це) на OSX.
Джонатан Хартлі

Я використовую незначний варіант цього. Мій .bashrc створює функцію Bash 'grp', яка визначається як GREP_OPTIONS=xxx grep "$@". Це означає, що змінна GREP_OPTIONS встановлюється лише для випадків grep, які я запускаю вручну за допомогою "grp". Це означає, що я ніколи не отримую ситуації, коли я запускаю інструмент, і всередині він викликає grep, але інструмент плутається через те, що grep не веде себе так, як очікувалося. Крім того, у мене є друга функція "grpy", яка викликає "grp", але додає --include=*.py, щоб просто шукати файли Python.
Джонатан Хартлі

Насправді, замислюючись, роблячи це так, більше не потрібно використовувати GREP_OPTIONS. Тепер у мене просто функція оболонки 'grp', яка викликає grep --exclude=tags --exclude_dir=.git ...etc... "$@". Мені подобається, що це працює як "ack", але я зберігаю усвідомлення та контроль за тим, що він робить.
Джонатан Хартлі

9

find . | grep -v \.svn


Вам доведеться втекти .в .svnрегулярному виразі.
владр

4
Використовуйте --fixed-рядки з grep: | fgrep -v /.svn/або `| grep -F -v / .svn / `для виключення саме каталогу, а не файлів з" .svn "як частини їх імені.
Stephen P

8

Чому ви не передаєте команду grep, що легко зрозуміло:

your find command| grep -v '\.svn'

Вам доведеться втекти .в .svnрегулярному виразі.
владр

@Yclian без тіні сумніву; якщо цього не зробити, каталоги під назвою 'tsvn', '1svn', 'asvn' тощо будуть також ігноровані з '.' є підстановочним символом регулярного вираження: "відповідати будь-якому символу".
vladr

Добре, я думав, що це станеться лише у випадку -E та -G. Я щойно перевірив, моє погано. :(
yclian

2
Мені подобається ця відповідь, оскільки вона концептуально простіша за всі інші. Я не можу запам’ятати смішний синтаксис для використання «знайти», але я точно можу згадати, як використовувати grep -v, оскільки він використовується у дуже багатьох ситуаціях.
mattismyname

8

Створіть сценарій під назвою ~/bin/svnfind:

#!/bin/bash
#
# Attempts to behave identically to a plain `find' command while ignoring .svn/
# directories.

OPTIONS=()
PATHS=()
EXPR=()

while [[ $1 =~ ^-[HLP]+ ]]; do
    OPTIONS+=("$1")
    shift
done

while [[ $# -gt 0 ]] && ! [[ $1 =~ '^[-(),!]' ]]; do
    PATHS+=("$1")
    shift
done

# If user's expression contains no action then we'll add the normally-implied
# `-print'.
ACTION=-print

while [[ $# -gt 0 ]]; do
    case "$1" in
       -delete|-exec|-execdir|-fls|-fprint|-fprint0|-fprintf|-ok|-print|-okdir|-print0|-printf|-prune|-quit|-ls)
            ACTION=;;
    esac

    EXPR+=("$1")
    shift
done

if [[ ${#EXPR} -eq 0 ]]; then
    EXPR=(-true)
fi

exec -a "$(basename "$0")" find "${OPTIONS[@]}" "${PATHS[@]}" -name .svn -type d -prune -o '(' "${EXPR[@]}" ')' $ACTION

Цей сценарій поводиться ідентично звичайній findкоманді, але він вирізує .svnкаталоги. Інакше поведінка ідентична.

Приклад:

# svnfind -name 'messages.*' -exec grep -Iw uint {} +
./messages.cpp:            Log::verbose << "Discarding out of date message: id " << uint(olderMessage.id)
./messages.cpp:    Log::verbose << "Added to send queue: " << *message << ": id " << uint(preparedMessage->id)
./messages.cpp:                Log::error << "Received message with invalid SHA-1 hash: id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Received " << *message << ": id " << uint(incomingMessage.id)
./messages.cpp:            Log::verbose << "Sent message: id " << uint(preparedMessage->id)
./messages.cpp:        Log::verbose << "Discarding unsent message: id " << uint(preparedMessage->id)
./messages.cpp:        for (uint i = 0; i < 10 && !_stopThreads; ++i) {
./virus/messages.cpp:void VsMessageProcessor::_progress(const string &fileName, uint scanCount)
./virus/messages.cpp:ProgressMessage::ProgressMessage(const string &fileName, uint scanCount)
./virus/messages.h:    void _progress(const std::string &fileName, uint scanCount);
./virus/messages.h:    ProgressMessage(const std::string &fileName, uint scanCount);
./virus/messages.h:    uint        _scanCount;

Цей сценарій не працює так, як я очікував. Запускаючи його зі "svnfind -type f", він також друкує svn-каталоги та файли у svn-каталогах
Ingo Fischer,

@ifischer Чи можете ви додати echoкоманду find і сказати, яка команда виконується? svnfind -type fвідмінно працює на моїй машині Red Hat.
Джон Кугельман

Гаразд, здається, це залежить від ОС. Я запускаю Debian Squeeze (те саме на Ubuntu). Я не розумію, що ви маєте на увазі під «додайте відлуння»?
Інго Фішер

@ifischer Змініть останній рядок, щоб echo find "${OPTIONS[@]}"...він надрукував команду find, а не виконував її.
Джон Кугельман

Ок змінив останній рядок на echo find ${OPTIONS[@]} ${PATHS[@]} -name .svn -type d -prune -o ( ${EXPR[@]} ) $ACTION, Це дає мені такий вихід:find -type f -name .svn -type d -prune -o ( -true ) -print
Інго Фішер

5

Я просто подумав, що я додам просту альтернативу до публікацій Kaleb та інших (які детально використовують find -pruneопцію ack, repofindкоманди , команди тощо), що особливо стосується використання, описаного вами у запитанні (та будь-яких інших подібних звичаях):

  1. Для підвищення продуктивності, ви завжди повинні намагатися використовувати find ... -exec grep ... +(спасибі Кендзі за вказівку на це) або find ... | xargs egrep ...(переносний) або find ... -print0 | xargs -0 egrep ...(GNU; роботи на імена файлів , що містять пробіли) , а не з find ... -exec grep ... \;.

    Форма find ... -exec ... +та find | xargsформа не роздвоєна egrepдля кожного файлу, а для групи файлів за один раз, що призводить до набагато швидшого виконання .

  2. При використанні find | xargsформи також можна використовувати , grepщоб легко і швидко чорнослив .svn(або будь-які каталоги або регулярний вираз), тобто find ... -print0 | grep -v '/\.svn' | xargs -0 egrep ...(корисно , коли вам потрібно що - то швидко і не можуть бути стурбовані , щоб пам'ятати , як налаштувати find«s -pruneлогіку.)

    find | grep | xargsПідхід аналогічний GNU find«S -regexопції (див ghostdog74» s пост), але більш компактний (також буде працювати на платформах , де GNU findне доступний.)


1
@Vlad: Зауважте, що для -execперемикання існує дві форми find: одна закінчується, ;а інша закінчується +. Той, що закінчується +замінює {}списком усіх відповідних файлів. Крім того, ваш регекс '/\.svn'відповідає імен файлів, як '.svn.txt'теж. Будь ласка, зверніться до моїх коментарів до питання для отримання додаткової інформації.
Siu Ching Pong -Asuka Kenji-

2
@Vlad: Ось стандарт POSIX для findутиліти. Будь ласка, дивіться -execчастину :-).
Siu Ching Pong -Asuka Kenji-

4

У сховищі вихідного коду я, як правило, хочу робити лише текстові файли.

Перший рядок - це всі файли, крім файлів репозиторію CVS, SVN та GIT.

Другий рядок виключає всі бінарні файли.

find . -not \( -name .svn -prune -o -name .git -prune -o -name CVS -prune \) -type f -print0 | \
xargs -0 file -n | grep -v binary | cut -d ":" -f1

3

Я використовую параметр find з параметрами -not-path. Мені не пощастило з чорносливом.

find .  -name "*.groovy" -not -path "./target/*" -print

знайде файли, що не входять у шлях до цільового каталогу.


3

Щоб вирішити цю проблему, ви можете просто скористатися цією умовою пошуку:

find \( -name 'messages.*' ! -path "*/.svn/*" \) -exec grep -Iw uint {} +

Ви можете додати більше обмежень, як це:

find \( -name 'messages.*' ! -path "*/.svn/*" ! -path "*/CVS/*" \) -exec grep -Iw uint {} +

Додаткову інформацію про це ви можете знайти в розділі "Оператори" у розділі "Оператори": http://unixhelp.ed.ac.uk/CGI/man-cgi?find


3

Зауважте, що якщо це зробити

find . -type f -name 'messages.*'

тоді -printмається на увазі, коли весь вираз ( -type f -name 'messages.*') є істинним, тому що немає "дії" (як -exec).

Хоча для припинення спуску в певні каталоги ви повинні використовувати все, що відповідає цим каталогам, і слідувати за ним -prune(що призначене для припинення спускання в каталоги); так:

find . -type d -name '.svn' -prune

Це має значення True , для .svn каталогів, і ми можемо використовувати булеву коротке замикання, слідуючи цей шляхом -o(OR), після чого слід , що після того , як -oперевіряються тільки коли перша частина Хибна, отже , є НЕ в директорії .svn. Іншими словами, наступне:

find . -type d -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

буде оцінювати лише те, що є правильним -o, а саме -name 'message.*' -exec grep -Iw uint {}для файлів, які НЕ знаходяться у каталогах .svn.

Зауважте, що оскільки .svnце, ймовірно, завжди каталог (а не, наприклад, файл), і в цьому випадку, безумовно, не відповідає імені 'message. *', Ви можете також залишити -type dта робити:

find . -name '.svn' -prune -o -name 'message.*' -exec grep -Iw uint {}

Нарешті, зауважте, що якщо ви пропустите будь-яку дію ( -execце дія), скажіть так:

find . -name '.svn' -prune -o -name 'message.*'

тоді -printдія мається на увазі, але буде стосуватися виразу WHOLE, включаючи -name '.svn' -prune -oчастину, і таким чином надрукувати всі .svn каталоги, а також файли 'message. *', що, мабуть, не те, що потрібно. Тому завжди слід використовувати "дія" в правій частині булевого виразу при використанні -pruneтаким чином. І коли ця дія друкується, ви повинні явно додати її так:

find . -name '.svn' -prune -o -name 'message.*' -print


2

Спробуйте findrepo, який є простою обгорткою навколо find / grep і набагато швидше, ніж ack. Ви використовуєте це в такому випадку, як:

findrepo uint 'messages.*'

2

wcfind це скрипт пошуку обгортки, який я використовую для автоматичного видалення .svn каталогів.


1

Це працює для мене в підказці Unix

gfind. \ (-не-ім'я імені '* \. svn *' \) -типи f -name '. *' -exec grep -всім uint {} +

Команда, наведена вище, перелічить ФАЙЛИ, які не містять.


це "gfind" помилка друку? У мене його немає на Ubuntu 14.04.
Джонатан Хартлі

Якщо припустити, що ви мали на увазі «знайти», це не зовсім працює. Він також фільтрує файли на зразок xxx.svnxxx. Це важливо - наприклад, якщо ви використовуєте git замість svn, вам часто захочеться включити до результатів пошуку файли на зразок .gitignore (який не є метаданими, це звичайний файл, що входить до репо).
Джонатан Хартлі

1

Я зазвичай трубу вихід через grep ще один раз видалення .svn, в моєму використанні це не набагато повільніше. типовий приклад:

find -name 'messages.*' -exec grep -Iw uint {} + | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'

АБО

find . -type f -print0 | xargs -0 egrep messages. | grep -Ev '.svn|.git|.anythingElseIwannaIgnore'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.