findが特定のファイルを見つけた場合に組み込みシェルを実行する方法

findが特定のファイルを見つけた場合に組み込みシェルを実行する方法

通常、特定の仕様に一致するファイルが識別されたら、コマンドを実行するためにfind使用できます-exec。しかし、私の場合、find一致するものが見つかったらシェル/スクリプトを終了したいのですが、-execそうすることはできません。 [find確かに-exec bash関数を呼び出すこともできません。.)

たとえば、ツリーを削除するスクリプトに空のディレクトリのみが含まれている場合にのみ、ディレクトリ以外のエントリがあるかどうかを最初に確認し、最初の予期しないエントリに関するエラーメッセージで中断したいと思います。

これまでこのようなことをする必要があるたびに、出力を変数に入れて(-quitwithを使用してfind)空であることをテストしました。

私のスクリプトは次のとおりです。

#! /bin/sh
INTRUDER="$(find "$@" ! -type d -print -quit)"
if [ -n "$INTRUDER" ] ; then
    echo "Found non-dir $INTRUDER; leaving the arguments untouched"
    exit 1
fi
rm -R "$@"

これより他の/より良い方法がありますか? 「より良い」とは、コードが小さく、移植性が高いこと(上記の移植性の問題がある場合)などを意味します。 「異なる」とは、追加の変数を避け、その長さをテストすることを意味します。

答え1

これは私にとって効果的です。

find "$@" ! -type d -exec kill -9 $$ \; -quit && rm -R "$@"
  • find正常に終了すると(何も見つからない)rm -R "$@"実行されます。
  • 何かが見つかると、find現在のシェル/スクリプトが終了します($$pidが保存されます)。この場合 - 部分は決してrm実行されません。

関連情報