find
コマンドは、特に先進的なコンピュータで数百、数千ものファイルやフォルダーを扱う際に、非常に役立つ Linux コマンドの 1 つです。その名が示す通り、find
はさまざまなものを検索できます。検索できるのはファイル名だけではありません。
自分のコンピュータで作業している場合も、不慣れなシステムで作業する人をサポートする場合も、find
を使って重要なデータを見つけることができます。その 10 の方法をご紹介します。
[ よく使うコマンドをすぐに確認できる Linux コマンドチートシートはこちら ]
1.名前で 1 つのファイルを検索する
ファイル名はわかっているものの保存場所が思い出せない場合は、find
を使ってホームディレクトリを検索します。権限エラーを非表示にするには、2>/dev/null
を使用します (または、sudo
を使用してすべての権限を取得します)。
$ find / -name "Foo.txt" 2>/dev/null /home/seth/Documents/Foo.txt
2.おおよその名前で 1 つのファイルを検索する
正確なファイル名を思い出せない場合や、ファイル名に大文字が使われているかどうかわからない場合は、以下のようにすると、大文字と小文字を区別しないで部分一致検索を実行できます。
$ find / -iname "*foo*txt" 2>/dev/null /home/seth/Documents/Foo.txt /home/seth/Documents/foo.txt /home/seth/Documents/foobar.txt
3.すべてを検索する
ls -R
コマンドはディレクトリのコンテンツを再帰的に一覧表示します。つまり、指定したターゲットだけでなく、そのターゲット内のすべてのサブディレクトリ (存在する場合はそのサブディレクトリ、さらにそのサブディレクトリ、以下同様) まで一覧表示します。find
コマンドでも -ls
を使用して同じことができます。
$ find ~/Documents -ls 3554235 0 drwxr-xr-x [...] 05:36 /home/seth/Documents/ 3554224 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo 3766411 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foo.txt 3766416 0 -rw-rw-r-- [...] 05:36 /home/seth/Documents/Foo/foobar.txt
この例では 2>/dev/null
を使用していないことに注意してください。これは、ホームディレクトリ内のファイルパスのコンテンツのみを一覧表示しており、権限エラーが発生する可能性がないからです。
4.内容で検索する
find
コマンドが実行できるタスクは 1 つだけではありません。実際、find
では、find
が返す結果に対して別のコマンドを実行することもできます。これは特に、ファイルを名前ではなく内容で検索する必要がある場合や、名前と内容で検索する必要がある場合に便利です。
$ find ~/Documents/ -name "*txt" -exec grep -Hi penguin {} \; /home/seth/Documents/Foo.txt:I like penguins. /home/seth/Documents/foo.txt:Penguins are fun.
[ 成功するための Linux 環境管理についてはこちら ]
5.ファイルの種類で検索する
-type
を使用すると、ファイル、ディレクトリ、シンボリックリンク、名前付きパイプ、ソケットなどを表示できます。
$ find ~ -type f /home/seth/.bash_logout /home/seth/.bash_profile /home/seth/.bashrc /home/seth/.emacs /home/seth/.local/share/keyrings/login.keyring /home/seth/.local/share/keyrings/user.keystore /home/seth/.local/share/gnome-shell/gnome-overrides-migrated [...]
GNU バージョンの find
を使用している場合は、検索結果に複数のファイルの種類を含めることができます。
$ find ~ -type f,l -name "notebook*" /home/seth/notebook.org /home/seth/Documents/notebook-alias.org
6.ディレクトリのみを一覧表示する
ls
コマンドの欠点は、結果をファイルの種類で絞り込めないことです。そのため、パス内のディレクトリのみを一覧表示したい場合には、不要な情報が多く含まれることがあります。そのようなときには、find
コマンドに -type d
を組み合わせます。
$ find ~/Public -type d find ~/Public/ -type d /home/seth/Public/ /home/seth/Public/example.com /home/seth/Public/example.com/www /home/seth/Public/example.com/www/img /home/seth/Public/example.com/www/font /home/seth/Public/example.com/www/style
7.検索結果の表示を制限する
デフォルトのユーザーディレクトリ内に数百のファイルがあり、その外側にも数千のファイルがある場合、find
の結果が非常に多くなってしまうことがあります。-maxdepth
に続けて、find
の対象とするディレクトリの階層数を指定すると、検索の深さを制限できます。
$ find ~/Public/ -maxdepth 1 -type d /home/seth/Public/ /home/seth/Public/example.com
8.空のファイルを見つける
整理整頓のために空のファイルを見つけたい場合があります。
$ find ~ -type f -empty random.idea.txt
find
を使って空のファイルを削除することは技術的には可能ですが、ファイルをプログラムで削除するのは危険です。たとえば、空のファイルを検索するときに -type f
を入れ忘れると、結果にはディレクトリも含まれます。この場合、delete フラグを追加していると、重要なディレクトリ構造が削除されてしまいます。
find
コマンドを書いたら、結果を確認してから削除することが極めて重要です。さらに、find
で delete フラグの場所を間違えると、修飾が適用される前の結果で削除を実行してしまう可能性があります (たとえば、delete フラグを type フラグの前に配置すると、ファイルのみを削除しようとしたコマンドでディレクトリまで削除してしまいます)。
find
を使ってファイルを削除することはあまりありませんが、その場合には xargs
か、Parallel と trash コマンドを使用した方がよいでしょう。
9.ファイルの経過期間で検索する
-mtime
を使用すると、検索対象を指定した値の 24 倍より古い/新しいファイルに限定できます。
$ find /var/log -iname "*~" -o -iname "*log*" -mtime +30
-mtime
で指定する数値の前の +
は、その数値を時間に加算するという意味ではありません。これは、(この例では) 24 × 30 より大きい値に一致するという条件文です。つまり、このサンプルコードは 1 カ月以上変更されていないログファイルを検索します。
過去 1 週間以内に変更されたログファイルを検索するには、-
条件を使用します。
$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7 /var/log/tallylog /var/log/cups/error_log /var/log/cups/access_log /var/log/cups/page_log /var/log/anaconda/anaconda.log /var/log/anaconda/syslog /var/log/anaconda/X.log [...]
-ls
フラグについてはすでに説明しましたが、このコマンドと組み合わせるとより詳細な情報を得ることができます。
$ find /var/log -iname "*~" -o -iname "*log*" -mtime -7 -ls -rw------- 1 root root 0 Jun 9 18:20 /var/log/tallylog -rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/error_log -rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/access_log -rw------- 1 root lp 332 Aug 11 15:05 /var/log/cups/page_log -rw------- 1 root root 53733 Jun 9 18:24 /var/log/anaconda/anaconda.log -rw------- 1 root root 835513 Jun 9 18:24 /var/log/anaconda/syslog -rw------- 1 root root 21131 Jun 9 18:24 /var/log/anaconda/X.log [...]
10.パスを検索する
必要なファイルまでのディレクトリ構造はわかっているものの、システム内のどこにそのディレクトリ構造があるのかわからない場合があります。パス文字列内を検索するには -ipath
を使用します。これを指定すると、ドットとスラッシュは正規表現文字ではなく、ドットとスラッシュとして扱われます。
$ find / -type d -name 'img' -ipath "*public_html/example.com*" 2>/dev/null /home/tux/Public/public_html/example.com/font
まとめ
find
コマンドはシステム管理者に必須のツールです。新しいシステムについて調査したり、理解したり、間違った場所に置かれたデータを探したり、日々発生する問題をトラブルシューティングしたりする際に役立ちます。とはいえこれは、単なる便利ツールの 1 つでしかありません。
[ Linux find チートシートをダウンロードして、ショートカットをすべて 1 カ所にまとめておきましょう ]
find
を使用するのに特別な理由は必要ありません。find
を使えば、システム内を探し回る手間をかけずに、簡単に目的のものを検索できます。目立たないながらも非常に便利なツールであり、日々の Linux 管理作業に大きな喜びをもたらしてくれるでしょう。今すぐ使い始めて、その素晴らしさを実感してください。
執筆者紹介
Seth Kenlon is a Linux geek, open source enthusiast, free culture advocate, and tabletop gamer. Between gigs in the film industry and the tech industry (not necessarily exclusive of one another), he likes to design games and hack on code (also not necessarily exclusive of one another).
類似検索
チャンネル別に見る
自動化
テクノロジー、チームおよび環境に関する IT 自動化の最新情報
AI (人工知能)
お客様が AI ワークロードをどこでも自由に実行することを可能にするプラットフォームについてのアップデート
オープン・ハイブリッドクラウド
ハイブリッドクラウドで柔軟に未来を築く方法をご確認ください。
セキュリティ
環境やテクノロジー全体に及ぶリスクを軽減する方法に関する最新情報
エッジコンピューティング
エッジでの運用を単純化するプラットフォームのアップデート
インフラストラクチャ
世界有数のエンタープライズ向け Linux プラットフォームの最新情報
アプリケーション
アプリケーションの最も困難な課題に対する Red Hat ソリューションの詳細
仮想化
オンプレミスまたは複数クラウドでのワークロードに対応するエンタープライズ仮想化の将来についてご覧ください