ときでさえ /tmp
にはsomething
というファイルがありません。find
で検索すると0が返されます。
$ find /tmp -name something
$ echo $?
0
find
が何も見つからない場合、どのようにしてゼロ以外の終了ステータスを取得できますか?
これが私があなたが望むことをすると信じているワンライナーです:
find /tmp -name something | egrep '.*'
返却ステータスは0
何かが見つかった場合、それ以外の場合はゼロ以外。
さらに処理するためにfind
の出力もキャプチャする必要がある場合は、Svenの回答でそれをカバーしています。
印刷しないが、結果が見つかると0で終了する最も単純なソリューション
find /tmp -name something | grep -q "."
出口0は検索で簡単ですが、出口> 0は通常、エラーでのみ発生するため困難です。ただし、それを実現することはできます。
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
Puppetの問題を解決するための私の方法を見つけようとしているときにこの質問を見つけたところ(ディレクトリ自体ではなく、ディレクトリの下のフォルダのアクセス許可を変更する)、これはうまくいくようです:
test -n "$(find /tmp -name something)"
私の具体的なユースケースはこれです:
test -n "$(find /home -mindepth 1 -maxdepth 1 -perm -711)"
Findコマンドが必要な権限を持つファイルを見つけられない場合、コード1を終了します。
不可能です。 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
これが最も簡潔で直接的な方法だと思います。
test `find /tmp/ -name something -print -quit 2>/dev/null`
これが私が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変数を分割するか、単にそのための印刷ステートメントを追加できます。