Как сортировать находить результат, такие пути, начиная с одним из наборов шаблонов, сортированы последним

StackOverflow https://stackoverflow.com/questions/3697457

Вопрос

У меня есть команда поина, которую я хотел бы отсортировать такие, как записи для определенных каталогов сортируются последними. Причина в том, что этот список должен быть передан на 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top