findコマンドを実行した結果、ファイルが 1 つも見つからなかった場合の判定

Bash,CentOS,Linux,Ubuntu

はじめに

今回は、findコマンドを使ってファイルが見つからなかった場合の処理について紹介します。

findコマンドは Unix 系 OS でファイルを検索するために使われます。ただファイルを検索するだけではなく、パイプでつなぐことで見つかったファイルに対して 1 つずつ何かの処理をすることもできます。

さて、find コマンドで検索した結果、該当のファイルが 1 つも見つからなかった場合の処理はどう書いたら良いのでしょうか?

検証環境

$ uname -moi
aarch64 aarch64 GNU/Linux

$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu Kinetic Kudu (development branch)"
NAME="Ubuntu"
VERSION_ID="22.10"

$ bash -version | head -n 1
GNU bash, バージョン 5.2.0(1)-release (aarch64-unknown-linux-gnu)

$ find --version | head -n 2
find (GNU findutils) 4.9.0
Copyright (C) 2022 Free Software Foundation, Inc.

$ grep --version | head -n 2
grep (GNU grep) 3.7
Copyright (C) 2021 Free Software Foundation, Inc.

findgrep をパイプでつなぎ、ファイルの検出を判定

find の実行結果を grep -q . コマンドにパイプで渡します。

これは、grep . コマンドと同じ意味で、find の検索結果に何かしらの文字列があるかどうかを判定するために使われます。
違いは -qオプションです。
-q オプションは、 結果を表示せずに正常終了コードを返すことを意味します。
文字列が見つかった場合は 0 を返し、見つからなかった場合は 1 を返します。

以下のコードは、 /usr ディレクトリ下にある拡張子が .yaml のファイルを検索し、見つかった場合は "File found" と出力します。見つからなかった場合は "File not found" と出力します。

find /usr -name "*.yaml" | grep -q .
if [ $? -eq 0 ]; then
  echo "File found"
else
  echo "File not found"
fi

$? は、直前に実行したコマンドの終了ステータスを表します。
0 は正常終了を表し、それ以外の数値は異常終了を表します。
この例では、grep コマンドがファイルを見つけた場合に 0 を返し、それ以外の場合は 1 を返します。

更に上記のコードをワンライナーで書くと以下のようになります。

$ find /usr -name "*.go" | grep -q . && echo "File found" || echo "File not found"
File found

$ find /usr -name "*.yaml" | grep -q . && echo "File found" || echo "File not found"
File not found

ひとこと

find の実行結果を判定する場合には、grep -q . コマンドを使うと便利です。
正常終了コードが使われるため、if 文で簡単に判定できます。

Bash,CentOS,Linux,Ubuntu