通常、特定の仕様に一致するファイルが識別されたら、コマンドを実行するためにfind
使用できます-exec
。しかし、私の場合、find
一致するものが見つかったらシェル/スクリプトを終了したいのですが、-exec
そうすることはできません。 [find
確かに-exec
bash関数を呼び出すこともできません。.)
たとえば、ツリーを削除するスクリプトに空のディレクトリのみが含まれている場合にのみ、ディレクトリ以外のエントリがあるかどうかを最初に確認し、最初の予期しないエントリに関するエラーメッセージで中断したいと思います。
これまでこのようなことをする必要があるたびに、出力を変数に入れて(-quit
withを使用して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
実行されません。