Я часто использую команду 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 для этой рабочей копии.
find ... -print0 | xargs -0 egrep ...
вместоfind ... -exec grep ...
(разветвляется неgrep
для каждого файла, а для группы файлов за раз). Используя эту форму, вы также можете сократить.svn
каталоги без использования опции-prune
команды find, т.е.find ... -print0 | egrep -v '/\.svn' | xargs -0 egrep ...
- person vladr   schedule 08.03.2010-exec
с+
не разветвляетgrep
для каждого файла, тогда как использование его с;
делает. Использование-exec
на самом деле более правильное, чем использованиеxargs
. Обратите внимание, что команды типаls
что-то делают, даже если список аргументов пуст, а команды типаchmod
выдают ошибку, если аргументов недостаточно. Чтобы понять, что я имею в виду, просто попробуйте выполнить следующую команду в каталоге, в котором нет сценария оболочки:find /path/to/dir -name '*.sh' -print0 | xargs -0 chmod 755
. Сравните с этим:find /path/to/dir -name '*.sh' -exec chmod 755 '{}' '+'
. - person Siu Ching Pong -Asuka Kenji-   schedule 04.04.2010grep
-out.svn
тоже не лучшая идея. В то время какfind
специализируется на обработке свойств файлов,grep
нет. В вашем примере файл с именем '.svn.txt' также будет отфильтрован вашей командойegrep
. Хотя вы можете изменить свое регулярное выражение на '^ / \. Svn $', это по-прежнему не рекомендуется. Предикат-prune
дляfind
отлично подходит для фильтрации файла (по имени файла, метке времени создания или любому другому условию, которое вы указали). Это похоже на то, что даже если вы можете убить таракана большим мечом, это не значит, что это рекомендуемый способ сделать это :-). - person Siu Ching Pong -Asuka Kenji-   schedule 04.04.2010