web-dev-qa-db-ja.com

一致するファイルが見つからない場合、 `find`が0以外を返すようにできますか?

ときでさえ /tmpにはsomethingというファイルがありません。findで検索すると0が返されます。

  $ find /tmp -name something 
  $ echo $?
  0

findが何も見つからない場合、どのようにしてゼロ以外の終了ステータスを取得できますか?

56
yael

これが私があなたが望むことをすると信じているワンライナーです:

find /tmp -name something | egrep '.*'

返却ステータスは0何かが見つかった場合、それ以外の場合はゼロ以外。

さらに処理するためにfindの出力もキャプチャする必要がある場合は、Svenの回答でそれをカバーしています。

49
Steven Monday

印刷しないが、結果が見つかると0で終了する最も単純なソリューション

find /tmp -name something | grep -q "."
17
Matt Kneiser

出口0は検索で簡単ですが、出口> 0は通常、エラーでのみ発生するため困難です。ただし、それを実現することはできます。

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi
14
Steven Penny

Puppetの問題を解決するための私の方法を見つけようとしているときにこの質問を見つけたところ(ディレクトリ自体ではなく、ディレクトリの下のフォルダのアクセス許可を変更する)、これはうまくいくようです:

test -n "$(find /tmp -name something)"

私の具体的なユースケースはこれです:

test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"

Findコマンドが必要な権限を持つファイルを見つけられない場合、コード1を終了します。

9
shearn89

不可能です。 Findは、ファイルが見つからなかった場合でも、正常に終了すると0を返します(これは正しい結果ですnotファイルが実際に存在しない場合のエラーを示します)。

Findマンページを引用するには

終了ステータス

findは、すべてのファイルが正常に処理された場合はステータス0で、エラーが発生した場合は0より大きい状態で終了します。これは意図的に非常に広い説明ですが、戻り値がゼロ以外の場合、findの結果の正確さに依存すべきではありません。

あなたが達成したいことに応じて、あなたは-printファイル名とその出力に対してテストします。

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi
5
Sven

これが最も簡潔で直接的な方法だと思います。

test `find /tmp/ -name something -print -quit 2>/dev/null`
1
danorton

これが私が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

次に、ファイルのリストが必要な場合は、findに渡された-print 0を使用して、nullでout変数を分割するか、単にそのための印刷ステートメントを追加できます。

0
Jeff Ferland