Linux

【Linuxコマンド】findの使い方基本編

開発をしていると、ソースファイルや設定ファイルの場所を忘れてしまうことが良くあります。
そんなときに、findコマンドで一発検索、サクッとファイルの居場所を教えてくれます。

今回は、findコマンドの中でも、シンプルで最重要なコマンド構成を紹介します。

最初におさえておきたいfindコマンドの使い方

findコマンドの基本的な使い方になります。
これらのパターンをおさえておけば、findコマンドはほぼマスターと言ってもいいでしょう。

具体的なファイル名で検索

ファイル名を指定して検索するときのコマンド構成になります。

$ find 検索場所 [–name] 検索ファイル名

 

you
依頼人

workフォルダのどこかに、”passoword”ファイルがあるから、検索して見つけてくれる?

 

findコマンドを使って"password"を検索してみましょう。

$ find ./work/ -name password
./work/password

workの直下にpasswordファイルを見つけることができました。
ファイル名の大文字小文字を区別したくない場合は、「-name」の代わりに「-iname」を指定してみましょう。
-iname」もよく使うので、覚えておいてください!

あいまいなファイル名で検索

続いて、ファイル名があいまいなときに検索する方法になります。

 

you
依頼人

workフォルダのどこかに、ファイル名が”pass”を含むファイルがあるから、検索して見つけてくれる?

あいまいなファイル名やディレクトリ名を検索する場合は、「*」ワイルドカードを使用します。

ワイルドカードとは、何の代わりにでも使えるカードのこと。不特定の文字・文字列を表わす記号の意味。

$ find ./work/ -name *pass*
./work/pass02
./work/password
./work/pass
./work/pass01

workの直下にpass02、password、pass、pass01のファイルを見つけることができました。

ファイルの更新日時で検索

続いて、ファイルの更新日時を条件に検索する方法になります。

 

you
依頼人

workフォルダに、現在の時刻から30分前に作成されたファイルを検索して見つけてくれる?

現在の時刻から30分前までに作成されたファイルを検索します。

はじめに各ファイルの更新時間を確認します。

$ ls -l ./work/
-rw-rw-r-- 1 linux linux 0  8月 28 15:25 pass
-rw-rw-r-- 1 linux linux 0  8月 28 14:52 pass01
-rw-rw-r-- 1 linux linux 0  8月 28 16:16 pass02
-rw-rw-r-- 1 linux linux 0  8月 28 16:16 password

現在の時刻を確認します。

$ date
2019年 8月 28日  水曜日 16:17:10 JST

pass02、passwordファイルが検索でヒットしそうですね。

では、現在の時間から30分以内に作成されたファイルを検索してみましょう。
今回の条件では、「-mmin -30」を指定して検索します。

$ find ./work/ -mmin -30
./work/
./work/pass02
./work/password

workのディレクトリまで検索されました。

ファイルだけを検索したければ、コマンドに「-type f」を追加します。

$ find ./work/ -mmin -30 -type f
./work/pass02
./work/password

ディレクトリだけを検索したければ、コマンドに「-type d」を追加します。

$ find ./work/ -mmin -30 -type d
./work/

ファイルの更新日時のほかに、アクセス日時やステータスの変更された日時でも検索することができます。
詳しくはこちらをどうぞ。
findで日時指定検索(mmin、mtime)

findの検索結果に次のアクション(コマンド)

findコマンドの検索結果に対して、アクション(コマンド)を実行するために、「-exec」を追加します。

こちらが「-exec」を使用したときのコマンド構成になります。

$ find 検索場所 [–name] 検索ファイ(コマンド)ル名 [–exec] アクション \;

-execの使い方

具体的に「-exec」の使い方をみていきましょう。

 

you
依頼人

workフォルダのどこかに、”password”ファイルがあるから、検索して見つけてくれる?
さらに、そのファイルいらないから消去してくれる?

findコマンドを使って"password"を検索してみましょう。
さらに、ファイル削除用の「rm」コマンドを使って"password"ファイルを消去しましょう。

実際にコマンドを実行してみました。
passwordファイルが消去されたことを「ls」コマンドで確認しています。

$ find ./work/ -name password -exec rm {} \;
$ ls ./work/password
ls: ./work/passwordにアクセスできません: そのようなファイルやディレクトリはありません

上記コマンド内の「{}」には、findで検索した結果が代入されていると考えましょう。
具体的には、検索結果の「./work/password」が代入されています。

確認用に「echo」コマンドを使って「{}」の中身を表示してみました。

$ find ./work/ -name password -exec echo {} \;
./work/password

次に、注意点としてコマンドの最後に「\;」を付けないと、実行時にエラーになってしまいます。
実際に「\;」を消去した状態で、コマンド実行をしてみました。

$ find ./work/ -name password -exec rm {}
find: ‘-exec’に引数がありません

なので、「-exec」を使用するときは、必ず「\;」を付けて実行しましょう。

-execからパイプを介して複数のアクション(コマンド)

パイプ(「|」)を使うとさらにアクション(コマンド)を追加できます。

パイプを使用すると、パイプの前に実行したコマンドの結果を、次に実行するコマンドに引数として渡すことができます。

実際にパイプを使って実行してみましょう。
実行内容として、こちらを目的として実行しています。

  1. findコマンドでworkフォルダ内の"password"ファイルを検出します。
  2. "password"ファイルを「cat」コマンドで開きます。
  3. 「cat」コマンドで読み込まれた文字列を、大文字から小文字に変換しpassword.lowerファイルに保存します。

※大文字から小文字に変換するために、「tr」コマンドを使います。

$ cat ./work/password
PASSWORD
$ find ./work/ -name password -exec sh -c "cat {} | tr 'A-Z' 'a-z' > {}.lower" \;
$ cat ./work/password.lower
password

-exec」はひとつのアクション(コマンド)しか実行できません。
そのため、上記コマンドでは、ひとつのアクション(コマンド)として認識させるために、「sh -c」を使ってシェルとして複数のアクション(コマンド)を実行させています。

実際にシェルとして認識させないで、複数のアクション(コマンド)を実行するとどうなるかみてみましょう。

$ find ./work/ -name password -exec cat {} | tr 'A-Z' 'a-z' > {}.lower \;
find: '-exec'に引数がありません
tr: 余分な演算子';'
Try 'tr --help' for more information.

複数のアクション(コマンド)として認識されているため、エラーとなりました。

ここまでが、findコマンドの検索結果に対して、アクション(コマンド)を起こすために必要な「-exec」の説明でした。

サイトマップはこちら↓

▼ Linuxコマンドの記事一覧に戻る

-Linux

Copyright© カズンのブログ , 2020 All Rights Reserved Powered by AFFINGER5.