Как сортировать находить результат, такие пути, начиная с одним из наборов шаблонов, сортированы последним
Вопрос
У меня есть команда поина, которую я хотел бы отсортировать такие, как записи для определенных каталогов сортируются последними. Причина в том, что этот список должен быть передан на Etags для создания таблицы тегов, и я хотел бы, чтобы некоторые сторонние каталоги инструментов были в конце концов, который я активно редактирую.
Может ли кто-нибудь предложить хороший простым способом, чтобы сортировать список в качестве изменения в моем правлении Makefile? Вот текущее правило:
tags:
rm -f ../TAGS
find .. \( -not -regex '.*include/.*' \) \
-a \( -name '*.h' -o -name '*.hh' -o -name '*.y' \
-o -name '*.l' -o -name '*.cc' -o -name '*.cpp' \
-o -name '*.c' -o -name '*.inl' \) \
| xargs etags -o ../TAGS --append
Например, записи, которые начинаются "../flexlm/" или "../src/librsync" должны прийти после записей, которые не соответствуют одному из этих шаблонов.
Решение
Поставить несколько find
команды в прибавочной блоке и трубе, которые в xargs
:
# the single quotes take care of the escaping
pattern='( -not -regex ".*include/.*" )
-a ( -name "*.h" -o -name "*.hh" -o -name "*.y"
-o -name "*.l" -o -name "*.cc" -o -name "*.cpp"
-o -name "*.c" -o -name "*.inl" )'
{
find ! -path "../flexlm/*" ! -path "../src/librsync/*" $pattern
find -path "../flexlm/*" $pattern
find -path "../src/librsync/*" $pattern
} | xargs etags -o ../TAGS --append
Другие советы
Хорошо предполагая, что вы можете позволить себе запустить несколько запросов находки, и у вас есть ваш проект настроен таким образом, чтобы можно было найти свои собственные исходные файлы с одним запросом и любыми библиотеками с другими запросами ...
... Это было бы то, что я бы сделал.
Вот что работало для меня, сочетая вышеуказанные ответы и настраивая их:
PATTERN := \( -not -regex '.*include/.*' \) \
-a \( -name '*.h' -o -name '*.hh' -o -name '*.y' \
-o -name '*.l' -o -name '*.cc' -o -name '*.cpp' \
-o -name '*.c' -o -name '*.inl' \)
.PHONY: tags
tags:
rm -f ../TAGS
find .. \
! -path "../src/librsync/*" \
! -path "../flexlm/*" \
$(PATTERN) | xargs etags -o ../TAGS --append
find .. -path "../src/librsync/*" \
$(PATTERN) | xargs etags -o ../TAGS --append
find .. -path "../flexlm/*" \
$(PATTERN) | xargs etags -o ../TAGS --append