テンプレートを使用してファイルを生成する場合、テンプレート内にテンプレートの名前を含めることが重要です。生成されたファイルを読み取るときに、生成に使用されたテンプレートを見つけるのに役立ちます。
ディレクトリ内で独自のファイル名を含まないすべてのテンプレートを検索し、見つかったテンプレートを印刷し、見つかったテンプレートがあればゼロ以外のコードで終了したいと思います。
今のところ、私が思いついたのはこれです。
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
探しているファイルのリストが表示されますが、それでもゼロが返されます (エコーが成功したため)。