1

の一連のファイルを調べたいmakefile:

alltest:    all
            for f in $(FILES); do \
                echo $$f; \
            done

含まれていないファイルや本体に含まれ$(FILES)ているファイルを考慮するように書きたいと思います。/abc/*.txtERROR1ERROR2

ERROR1またはERROR2その本体に含まれる一連のファイルを探しすぎると、私は使用しますfind -iname '/abc/*.txt' | xargs grep -e "ERROR1" -e "ERROR2"

セットを補完する方法と、シェルコマンドをメイクファイルに統合する方法を誰か教えてもらえますか?

4

1 に答える 1

2

まず最初に…これはあなたが考え、望んでいることをしますか?

find -iname '/abc/*.txt'

サブディレクトリ内のファイルが見つかりません (Mac OS X 10.8.5 の場合)。wherefind . -iname '*.txt'はいくつかのファイルを検索find . -iname '/path/*.txtし、出力を生成せず、どちらも生成しません-ipath。ただし、find . -ipath '*/path/*.txt'ファイルのリストは生成されます。したがって、当面の間、findコマンドを次のように修正します。

find . -ipath '*/abc/*.txt'

次に、次を実行します。

xargs grep -e "ERROR1" -e "ERROR2"

これにより、ファイルの名前とメッセージの両方を含む行が生成されます。一致するファイルの名前が必要な場合は-l、コマンドに次を追加する必要があります。

find . -ipath '*/abc/*.txt' |
xargs grep -l -e "ERROR1" -e "ERROR2"

ただし、一致しないファイルのみを一覧表示する必要があります。そのために、 GNU をお持ちの場合は、次のオプションgrepを使用できます。-L

find . -ipath '*/abc/*.txt' |
xargs grep -L -e "ERROR1" -e "ERROR2"

GNU を持っていない場合はgrep、さらに多くの作業を行う必要があります。

find . -ipath '*/abc/*.txt' |
tee file.names |
xargs grep -l -e "ERROR1" -e "ERROR2" > matching.file.names
comm -23 file.names matching.file.names

このteeコマンドは、ファイル内のファイル名のリストのコピーをキャプチャしますfile.names(そのような独自性)。このgrepコマンドは、一致するファイル名のリストを にキャプチャしますmatching.file.names。名前は、両方のファイルで同じ順序になります。に表示されるが表示されfile.namesないmatching.file.namesものは、必要なものです。デフォルトでは、comm file.names matching.file.namesコマンドは 3 つの列を出力します。最初のファイルでのみ見つかった行、2 番目のファイルでのみ見つかった行、および両方のファイルで見つかった行です。オプションを使用して列 2 と 3 の出力を抑制することにより-23、他のファイルには見つからない最初のファイルの名前のみが取得されます。これが必要なリストです。

どこからリストを取得するかはあなた次第です…</p>

于 2013-09-22T05:06:15.607 に答える