回答:
ここにあなたが望むものを行うと思うワンライナーがあります:
find /tmp -name something | egrep '.*'
戻りステータスは0
、何かが見つかった場合になり、そうでない場合はゼロ以外になります。
find
さらに処理するためにの出力もキャプチャする必要がある場合は、Svenの答えがそれをカバーしています。
find ... | read
終了0は検索で簡単ですが、終了> 0はより困難です。これは通常、エラーが発生した場合にのみ発生するためです。ただし、それを実現することはできます。
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
、実行した-exec
sの終了コードに依存していないようです。
exec
、戻り値の下ではなく、セクションに隠されています)。見つからないものを区別することはできず、エラーが発生することもあります(存在しない開始点で呼び出された場合など)。
Puppetの問題を解決する私の方法を見つけようとしているときにこの質問を見つけただけです(ディレクトリ自体ではなくディレクトリの下のフォルダのアクセス許可を変更します)、これはうまくいくようです:
! test -z $(find /tmp -name something)
私の特定のユースケースはこれです:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
findコマンドが必要な権限を持つファイルを見つけられない場合、コード1を終了します。
不可能です。Findは、ファイルが見つからなかった場合でも、正常に終了した場合は0を返します(ファイルが実際に存在しない場合はエラーを示さない正しい結果です)。
検索マンページを引用するには
終了ステータス
すべてのファイルが正常に処理された場合はステータス0、エラーが発生した場合は0より大きい終了を検索します。これは意図的に非常に広範な説明ですが、戻り値がゼロ以外の場合、findの結果の正確さに依存するべきではありません。
達成したい内容に応じて-print
、ファイル名を見つけて、その出力に対してテストすることができます。
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
オプションの下に文書化されています(で使用+
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
これが最も簡潔で直接的な方法だと思います。
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
あなたの懸念に対処するかもしれない誤って省略しました。
ここに私が呼んだ小さなスクリプトがありますtest.py
。設定されている場合はエラーコードを返し、findがファイルを一覧表示しなかった場合はさらにエラーコードを返すという点で投稿された他のメソッドを改善します。
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
コマンドライン出力は次のとおりです。
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
次に、findでエラーが発生したがファイルが見つかった結果について:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
次に、ファイルのリストが必要な場合は、-print 0
渡されfind
た変数を使用して、nullでout変数を分割するか、単にprintステートメントを追加します。
find
成功したときに終了ステータスコードをゼロとして返すだけではありません。UNIXでは、実行するコマンドが何であれ、成功すると終了ステータスをゼロとして返します。
*
上のegrep
正規表現は、完全に冗長です。egrep
正規表現の構文を使用していないため、単純な旧式の方grep
が数マイクロ秒高速になる場合があります。