web-dev-qa-db-ja.com

findコマンドで何も見つからなかったかどうかを確認する方法(bash、openSUSE)?

私はそのようなfindコマンドでforループを使用することが可能であることを知っています

for i in `find $something`; do (...) done

しかし、ifコマンドでfindコマンドを使用したいと思います。

スクリプトによって削除されたファイルに関する進捗コメント(および後でログファイル)を作成しようとしています。私はチェックする必要があります

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS

何かを見つけたかどうか。そうでない場合は、echo「$ DAYS日より古いファイルはありません」または次のように言います。

シェルスクリプトでそれを行うにはどうすればよいですか?

14
Izzy

出力された行数をカウントして変数に格納し、テストします。

lines=$(find ... | wc -l)
if [ $lines -eq 0 ]; then
...
fi
16
Mark Setchell

findコマンドinside an if conditionを使用したい場合は、次の1つのライナーを試すことができます。

 [[ ! -z `find 'YOUR_DIR/' -name 'something'` ]] && echo "found" || echo "not found"

使用例:

 [Prompt] $ mkdir -p Dir/dir1 Dir/dir2/ Dir/dir3                 
 [Prompt] $ ls Dir/
 dir1  dir2  dir3
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 not found
 [Prompt] $ touch Dir/dir3/something
 [Prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 found
10
bachN

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

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

可能であればこれを1行で実行したかったのですが、エラーを発生させずに終了コードを変更する方法を見つけることができませんでした。

ただし、特定の要件があれば、以下が機能するはずです。

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS | grep 'tar.gz' || echo "You don't have files older than $DAYS days"

これは、findの出力を同じもののgrepに渡すことで機能し、何も見つからない場合は失敗の終了コードを返します。見つからない場合は成功し、見つかった行をエコーし​​ます。

||以降はすべて、前のコマンドが失敗した場合にのみ実行されます。

3
Andrew Stubbs

ファイル名にスペースが含まれている場合、findの出力を反復処理することは危険な場合があります。そうでないことが確実な場合は、findの結果を配列に格納し、そのサイズをチェックしてヒットがあったかどうかを確認できます。

results=( $(find -name "$something") )
if (( ${#results[@]} )) ; then
    echo Found
else
    echo Not found
fi
for file in "${results[@]}" ; do
   # ...
done
1
choroba