シェルの「*」globを使用しますが、ファイルを除いてディレクトリと一致しませんか?

シェルの「*」globを使用しますが、ファイルを除いてディレクトリと一致しませんか?

配布用のzip / tarbarを作成するmakefileルールがあります。レシピでは、CR / LFが正しいことを確認し、パッケージングする前に実行ビットが正しいことを確認するなど、「付加価値」タスクを実行します。

プロジェクトには多数のファイルがありますが、要件は次のとおりです。(1)GNUmakefileneedを除くすべてのファイルCR/LF、(3)needのみがGNUmakefile必要LF、(3)GNUmakefileneedを除くすべてのファイルa-x

レシピは次のとおりです。

.PHONY: convert
convert:
    chmod a-x *[^GNUmakefile*] TestData/*.dat TestVectors/*.txt
    unix2dos --keepdate --quiet *[^GNUmakefile*] TestData/*.dat TestVectors/*.txt
    dos2unix --keepdate --quiet GNUmakefile

*IDE固有のファイルなど、一部のファイルは明確ではないため、ビュッフェ内のすべてのファイルを明示的に一覧表示しないようにしています。 (*[^<somefile>*]これはきちんとしたトリックです。私はグローバルマッチングからパターンを除外)。

問題は、TestData一致TestVectors時に実行中なので、chmod a-xディレクトリから自分自身を除外することです。

何かを改善する必要がありますが、どうすればいいかわかりません。シェルの「*」globを使用したいのですが、ファイルを除いてディレクトリと一致しません。

どうすればいいですか?

ベストアンサー1

filter-outこの問題はGNU Makeと関数を使って解決しますwildcard。これらで実行できない唯一の作業は、ディレクトリをフィルタリングすることです。これはシェルを介して行う必要があります。以下のコードはテストされておらず、(a)ファイル名にスペースやシェルメタTestData/*.dat文字がなく、(b)TestVectors/*.txtディレクトリチェックが不要であるとします。

NORM_TOPLEVEL := $(shell for f in $(filter-out GNUMakefile,$(wildcard *)); \
                   do [ -d "$$f" ] || printf '%s\n' "$$f"; done)
NORM_TESTDIRS := $(wildcard TestData/*.dat) $(wildcard TestVectors/*.txt)

convert:
    chmod a-x $(NORM_TOPLEVEL) $(NORM_TESTDIRS)
    unix2dos --keepdate --quiet $(NORM_TOPLEVEL) $(NORM_TESTDIRS)
    dos2unix --keepdate --quiet GNUmakefile

.PHONY: convert

おすすめ記事