パターンのセットの 1 つで始まるパスが最後にソートされるように検索結果をソートする方法

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

質問

特定のディレクトリのエントリが最後にソートされるようにソートしたい find コマンドがあります。その理由は、このリストがタグ テーブルを作成するために etag に渡されることと、アクティブに編集するすべてのコードの後に​​特定のサードパーティ ツール ディレクトリを置きたいためです。

私のメイクファイルルールの変更としてリストを並べ替える良い簡単な方法を誰かが提案してもらえますか?現在のルールは次のとおりです。

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

他のヒント

複数の検索クエリを実行する余裕があり、1 つのクエリで独自のソース ファイルを検索し、他のクエリでライブラリを検索できるようにプロジェクトが設定されていると仮定します...

...それが私ならそうするでしょう。

上記の答えを組み合わせて微調整することでうまくいったのは次のとおりです。

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