【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を実行する例です。

$ find . -type f -exec ls -l {} \;
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt

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

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

$ find . -type f -ls
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt

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万字程度だそうです)。

$ find . -type f -exec ls -l {} +
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt

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

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

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

おわりに

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

 Blog TOP  Linuxコマンドを勉強したい人向け|Linuxの使い方 記事まとめ

Linux&Linuxコマンドを勉強したい人向けの記事もくじ

Linux&Linuxコマンドを勉強したい人向けの記事もくじ

用語解説・技術一般

  "UNIXとLINUX"の違いについて解説します
  CUIとGUIの違い・特徴について解説します

サーバリソースを確認するコマンドの使い方

  【Linux】CPU使用率を確認する3つの方法を解説します
  【Linux】ps実行時に-efオプションを付ける理由について
  【Linux】topコマンドで,CPU消費の原因を特定する方法

ファイル操作に関するコマンドの使い方

  【Linux】ファイルの行数をカウントする方法を解説
  【Linux】文字コード変換ならiconvコマンド1択です
  【Linux】/dev/nullを、エンジニアが使う2つの目的
  【Linux】findのexecオプションの使い方とその注意点
  【Linux】findの結果から圧縮ファイルを作るコマンド
  【Linux】hostsの場所はどこ?→/etc/hostsにあります
  【Linux】touchコマンドで,時刻更新&空ファイル作成

Linux管理者用コマンドの使い方

  【Linux】再起動コマンド(shutdown)の使い方と注意点

よく使う便利なコマンドの使い方

  【Linux】改行なしでechoコマンドを使う時の,-nオプション
  【Linux】sleepコマンドの使用例と注意点について解説する
  【Linux】rmコマンドでディレクトリを削除する方法を解説
  【Linux】awkの区切り文字を指定する,-Fオプションを解説
  【Linux】sedで文字列の置換をするeオプションを解説する
  【Linux】大文字から小文字に変換する方法【小文字から大文字も】

シェルの便利機能

  【Linux】コマンド履歴を検索する【Ctrl+r】


今、ITエンジニアは前例のない売り手市場です

ITエンジニアは前例のない売り手市場、転職なら今

現在のエンジニアの求人数と求人倍率をご存知ですか?

直近(※)のIT業界全体の求人倍率は7.85倍です。

つまり 企業が8回 IT人材の求人を出しても、 1人しかエントリーがない 状況です。

エンジニア側が企業を選ぶ なら、今がチャンスです。

※転職サイトdodaが毎月発表している転職求人倍率。
 2019年12月9日発表/集計対象期間は2019年11月1日〜30日

詳しくはこちら


人気記事【今年の抱負】退職しオープン&フリー&シンプルに生きていく【失敗しない働き方改革の本質】