Как отсортировать результат поиска так, чтобы пути, начинающиеся с одного из набора шаблонов, были отсортированы последними - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть команда find, которую я хотел бы отсортировать так, чтобы записи для определенных каталогов сортировались последними. Причина в том, что этот список нужно передать etags для создания таблицы тегов, и я хотел бы, чтобы некоторые сторонние каталоги инструментов были после всего кода, который я активно редактирую.

Может ли кто-нибудь предложить хороший простой способ сортировки списка как изменения в моем правиле make-файла? Вот текущее правило:

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", должны следовать за записями, которые не соответствуют ни одному из этих шаблонов.

Ответы [ 3 ]

2 голосов
/ 13 сентября 2010

Поместите несколько команд 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
1 голос
/ 13 сентября 2010

Хорошо, если вы можете позволить себе запускать несколько запросов на поиск, и ваш проект настроен таким образом, что вы можете найти свои собственные исходные файлы одним запросом и любые библиотеки с другими запросами ...

... Я бы так и сделал.

0 голосов
/ 15 сентября 2010

Вот что сработало для меня, объединив приведенные выше ответы и настроив их:

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
...