パターンのセットの 1 つで始まるパスが最後にソートされるように検索結果をソートする方法
質問
特定のディレクトリのエントリが最後にソートされるようにソートしたい 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
所属していません StackOverflow