ディレクトリ内のファイルを簡単に検索する方法 – findコマンドの使い方

スポンサーリンク
findについて ノウハウ
findについて
この記事は約8分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、find コマンドをご紹介します。

先日は、sedコマンドをご紹介したので、次に自分がよく使用する find コマンドについてシェアします。

スポンサーリンク

動作環境

この記事のコマンドは下記の環境で動作確認をしています。

% sw_vers 
ProductName:            macOS
ProductVersion:         13.2.1
BuildVersion:           22D68

% sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M1 Max

find とは

find コマンドは、指定されたディレクトリの中から条件に一致するファイルやディレクトリを探索するために使用される、LinuxやUnixのコマンドラインでよく使用されるコマンドです。

基本的な構文は以下のようになります:

find [探索するディレクトリ] [探索条件]

例えば、ホームディレクトリ以下のすべてのファイルを検索する場合、以下のように入力します:

find ~/ -type f

この例では、ホームディレクトリ 以下にあるすべてのファイルを検索しています。-type オプションは、検索するファイルのタイプを指定します。f はファイルを意味します。このコマンドを実行すると、ホームディレクトリ以下のすべてのファイルが表示されます。

他によく使われるオプションは以下のようになります:

  • -name : ファイル名を指定して検索する
  • -iname : 大文字小文字を無視してファイル名を指定して検索する
  • -size : ファイルサイズを指定して検索する
  • -mtime : 変更日時を指定して検索する
  • -exec : 検索結果に対して指定したコマンドを実行する

詳しい使い方については、man find コマンドを実行するか、オンラインドキュメントを参照してください。

ホームディレクトリ とは

ホームディレクトリは、LinuxやUnix系のオペレーティングシステムで、各ユーザーが作成されたときに割り当てられる、そのユーザー専用のディレクトリです。通常は、/home ディレクトリ以下に各ユーザーの名前で作成されます。

ホームディレクトリには、そのユーザーが所有するデータやファイルが格納されます。ユーザーは、ホームディレクトリ内でファイルやディレクトリを作成し、自由に使用できます。また、ホームディレクトリには、ユーザーの設定ファイルやプログラムなど、システムの動作に関わるファイルが保存されることもあります。

例えば、ユーザー名が user の場合、そのユーザーのホームディレクトリは、/home/user になります。通常、このディレクトリは、ユーザー名と同じ名前で作成されますが、システムの設定によっては異なる場合もあります。

findを使用したユースケース

いくつかの便利な find コマンドの使い方を紹介します。

特定の拡張子を持つファイルを検索する

find /path/to/directory -type f -name "*.txt"

上記の例では、/path/to/directory 内のすべての .txt ファイルを検索しています。

ファイルサイズが特定の値以上のファイルを検索する

find /path/to/directory -type f -size +10M

上記の例では、/path/to/directory 内のファイルで、10 MB よりも大きいファイルを検索しています。

特定の日付よりも前に更新されたファイルを検索する

find /path/to/directory -type f -mtime +7

上記の例では、/path/to/directory 内のファイルで、7日よりも前に更新されたファイルを検索しています。

検索結果を別の場所にコピーする

find /path/to/directory -type f -name "*.txt" -exec cp {} /path/to/destination \;

上記の例では、/path/to/directory 内の .txt ファイルを検索し、それらを /path/to/destination にコピーしています。

検索結果をリダイレクトしてファイルに保存する

find /path/to/directory -type f -name "*.txt" > filelist.txt

上記の例では、/path/to/directory 内の .txt ファイルを検索し、それらのファイル名を filelist.txt というファイルに保存しています。

まとめ

これらは find コマンドのよく使われる便利な使い方の一部ですが、find コマンドにはさまざまなオプションがあり、用途に合わせたカスタマイズが可能です。

リダイレクトとは

シェルのリダイレクトは、シェルで実行されるコマンドの入出力を、ファイルやデバイスなど、異なる場所に向けるための仕組みです。以下に代表的なリダイレクトの使い方を説明します。

標準出力をファイルにリダイレクトする

コマンドの標準出力をファイルに保存するために、> 演算子を使用します。例えば、以下のコマンドは、ls コマンドの出力を filelist.txt ファイルに書き込みます。

ls > filelist.txt

標準入力をファイルからリダイレクトする

コマンドの標準入力をファイルから読み込むために、< 演算子を使用します。例えば、以下のコマンドは、filelist.txt ファイルの内容を sort コマンドに渡します。

sort < filelist.txt

標準エラー出力をファイルにリダイレクトする

コマンドの標準エラー出力をファイルに書き込むために、2> 演算子を使用します。例えば、以下のコマンドは、mycommand コマンドのエラー出力を errorlog.txt ファイルに書き込みます。

mycommand 2> errorlog.txt

標準出力と標準エラー出力を同じファイルにリダイレクトする

コマンドの標準出力と標準エラー出力を同じファイルに書き込むために、&> 演算子を使用します。例えば、以下のコマンドは、mycommand コマンドの標準出力とエラー出力を output.txt ファイルに書き込みます。

mycommand &> output.txt

リダイレクトしたファイルを追記する

ファイルの先頭に追記する場合は、>> を使用します。例えば、以下のようにすると、command の出力を output.txt ファイルに追記できます。

command >> output.txt

以上が、シェルのリダイレクトに関する基本的な情報です。これらを組み合わせて、シェルスクリプトを作成したり、コマンドをより柔軟に使用したりすることができます。

標準入力、標準出力と標準エラーについて

標準入力、標準出力、標準エラーは、プログラムやコマンドが実行されたときに、情報の受け渡しをするために使用されるストリームです。ストリームは、プログラムやコマンドが実行されたときに、データの入出力をするための手段です。

標準入力 (stdin)

標準入力は、コマンドが入力を受け取るためのストリームです。通常、キーボードからの入力を受け取りますが、リダイレクトを使用してファイルからの入力を受け取ることもできます。標準入力のファイル記述子は、0です。

標準出力 (stdout)

標準出力は、コマンドが結果を出力するためのストリームです。通常、端末に出力されますが、リダイレクトを使用してファイルに出力することもできます。標準出力のファイル記述子は、1です。

標準エラー (stderr)

標準エラー出力は、コマンドがエラー情報を出力するためのストリームです。通常、端末に出力されますが、リダイレクトを使用してファイルに出力することもできます。標準エラー出力のファイル記述子は、2です。

ユースケース

例えば、以下のコマンドを考えてみましょう。

ls > output.txt

このコマンドは、ls コマンドの実行結果を標準出力 (stdout) ストリームから output.txt ファイルにリダイレクトしています。エラーメッセージがあれば、標準エラー出力 (stderr) ストリームから出力されます。

ls not_a_directory 2> error.txt

このコマンドは、ls コマンドに存在しないディレクトリ名を渡しています。エラーメッセージは、標準エラー出力 (stderr) ストリームから出力されますが、リダイレクトを使用して error.txt ファイルに保存します。

以上が、標準入力、標準出力、標準エラー出力の基本的な情報です。

おわりに

今日は、findコマンドについて説明しました。

findコマンドの主なメリットは、大量のファイルやディレクトリから、特定のファイルやディレクトリを検索することができることです。以下は、その他のメリットの例です。

  1. 検索の柔軟性 findコマンドは、ファイルやディレクトリの名前、所有者、更新日、パーミッションなど、検索条件を柔軟に指定できます。さらに、正規表現を使用して、検索条件をより複雑にすることもできます。
  2. パイプライン処理に適している findコマンドは、パイプライン処理に適しており、grepやsedなどの他のコマンドと組み合わせることができます。これにより、より複雑な検索や、検索結果の加工などを行うことができます。
  3. バッチ処理に適している findコマンドは、バッチ処理に適しています。例えば、定期的に実行するスクリプトに組み込んだり、複数のファイルやディレクトリを一括で処理することができます。
  4. ファイルの削除や移動が簡単にできる findコマンドは、検索結果を削除や移動することができます。これにより、不要なファイルやディレクトリを一括で削除することができ、ディスクの容量を効果的に管理することができます。
  5. 検索速度が速い findコマンドは、ファイルシステムを再帰的に検索するため、非常に高速に動作します。さらに、オプションを適切に指定することで、検索速度をさらに向上させることができます。

こうしたメリットがあるので、findコマンドを使用するとより効率的な作業ができると思いますので、是非使用してみてください。

よっしー
よっしー

それでは、また明日お会いしましょう!

コメント

タイトルとURLをコピーしました