独自のファイル名を含まないファイルを検索する方法

独自のファイル名を含まないファイルを検索する方法

テンプレートを使用してファイルを生成する場合、テンプレート内にテンプレートの名前を含めることが重要です。生成されたファイルを読み取るときに、生成に使用されたテンプレートを見つけるのに役立ちます。

ディレクトリ内で独自のファイル名を含まないすべてのテンプレートを検索し、見つかったテンプレートを印刷し、見つかったテンプレートがあればゼロ以外のコードで終了したいと思います。

今のところ、私が思いついたのはこれです。

find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \;

これにより、ファイルは正常に検出され、印刷されますが、ファイルが見つかったかどうかに関係なく、終了コード 0 で終了します。関連するファイルを見つけて、見つかった場合に 0 以外のコードで終了するにはどうすればよいでしょうか。

答え1

関連するファイルを見つけて、見つかった場合にゼロ以外のコードで終了するにはどうすればよいでしょうか?

結果を にパイプしますgrep ''。ツールはテキスト ストリームを変更しませんが、通過する行があるかどうかに応じて終了ステータス0または を生成します。1

逆のことをしたいのもわかります。grepでも、もし私があなただったら、の振る舞いに合わせるでしょう。私の根拠は、あなたが知りたいのは、条件に合うファイルであり、コマンドはそれを見つけるので、成功する少なくとも 1 つのファイルがあるかどうかを確認します。

しかし、もしあなたが反対の行動を主張するなら、終了ステータスを否定する。 例:

! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep ''

sh注:呼び出しを 内でデバッグしました。に拡張するfindと、元のアプローチは逆効果になります(これは多くの Linux ファイルシステムで有効なファイル名です)。{}./a;rm -rf ~;.xyz

答え2

おそらく、次のようなものgrep .... && <do if found> || <do if not found>が機能するだろう

答え3

for f in *.xyz; do
    grep -q $f $f || echo "$f does not contain itself"
done

探しているファイルのリストが表示されますが、それでもゼロが返されます (エコーが成功したため)。

関連情報