【Linux】findのexecオプションの使い方と注意点

シェル/bash

findコマンドのexecオプションについて調べる人

findコマンドのexecオプションについて調べる人
「特定の条件に合致したファイルに対して一気に処理がしたいので、findコマンドのexecオプションの使い方を再確認したいです。また、すぐにコピペして再利用できる例も見たい。」

こんな悩みを解決します。

この記事を書いている私はIT業界歴12年、うちサーバエンジニア歴6年、年収1,000万円ちょっとの金融系エンジニアです。IRIXやSolarisなどのUnixやmac、Linuxなど様々なUNIX系環境を扱ってきました。

これまでの経験を踏まえ、コマンドの解説に留まらず実務視点で利用方法を記事にしました。お役にたちましたら幸いです。

本記事で扱うのはLinux/Macのfindコマンドです

本記事では、LinuxまたはMac環境を前提にしています。それ以外のUNIX環境では一部の動作が異なることがあります。

本記事の内容

  • 1. 【構文①】find 《検索ディレクトリ》 -exec 《実行コマンド》 \;
  • 2. 【構文②】find 《検索ディレクトリ》 -exec 《実行コマンド》 +
  • 3. 運用業務上の注意点

1. 【構文①】findのexecオプションの構文

findコマンドのexecオプションは、以下の構文を用います。

find 《検索ディレクトリ》 -exec 《実行コマンド》 \;

構文①を使った、簡単な例

まずは簡単な例から示します。カレントディレクトリ(.)以下にあるファイル(-f)に対して、それぞれ個別に({} \;)、ls -lを実行する例です。

なお、ファイル(-f)に対象を絞っているのは、find結果にディレクトリが含まれるのを防ぐためです。ディレクトリが含まれると、ディレクトリ以下のファイルの情報(ls -l)まで表示されてしまいます。

実はfind結果をls形式で表示したい場合は、-execを使わなくても最初から専用のオプション(-ls)があります。これを用いて、次のように記述するのが一般的です。

2.【構文②】検索結果をまとめて-execの引数にする

上の例では、file2→file3→file1の順に結果が表示されています。これは、findがファイルを見つけた順番に個別に-execで指定したコマンドを実行し結果を表示しているからです。
《findで見つかったファイルに対して、こんなイメージで処理しています》

 ls -l file2.txt
 ls -l file3.txt
 ls -l file1.txt

個別に実行するのではなく、次のようにまとめて実行する方法を解説します。

 ls -l file2.txt file3.txt file1.txt

構文

まとめて実行するには、末尾を+にします。

find 《検索ディレクトリ》 -exec 《実行コマンド》 +

構文②を使った、簡単な例

findで見つかったfile1〜3の3つのファイルをまとめてls -lする事で、1から3に順番に表示することができました。

この方式ならば、ls -lrtのように引数に与えられたファイルに対する実行結果を並び替える処理も機能します。

また対象のファイルごとにlsプロセスを都度生成しないため処理が早く、CPUなどリソースへの負荷も一般的に低いはずです。ただしfindで見つかったファイルがずらっと引数として並びますので、大量のデータを扱う際には引数の上限には注意が必要です(一般に、UNIXのシェルの引数の文字の上限は20万字程度だそうです)。

3.【find】 -execオプション利用時の業務上の注意点

find -execオプションを業務で使う上での注意点

find -execは汎用性が高いコマンドで、理解することで業務効率アップに有用です。
一方findの結果次第では処理対象が非常に多くなり、想定外にサーバが高負荷になる事象も起こり得ます。
対象範囲を絞ったり、execオプションで実行するコマンドが負荷の高いものでないか確認することも有用です。また、本番環境で実行する際はインフラリソースへの影響評価も含め、十分なテストと準備をすべきです。

おわりに

今回は以上です。findコマンドの-execオプションについて解説しました。実務等で利用する場合の参考になりますと幸いです。