Engineering
【備忘録】ubuntu findコマンドでファイルを探す
- 作成日:2024年3月18日1:21
- 更新日:2024年4月4日22:35
tips
ubuntu
Ubuntuのfindコマンドはファイルの場所を確認するときに用いられる便利なコマンドです。使用できるオプションは多岐にわたりますが、ここでは備忘録として特に有用ないくつかのユースケースについて出力例とともに紹介します。
man find
...
NAME
find - search for files in a directory hierarchy
...
以下順次更新していきます。
実行例1:ファイル名から検索する場合
find <探索始点ディレクトリ> -name <ファイル名>
<探索始点ディレクトリ>は、.
を指定すれば現在のディレクトリの中から、/
を指定すればルートディレクトリから探索を実行します。
# 現在のディレクトリ内に含まれるdemo-01.txtファイルを探索
demo@demo-01-Ubuntu22:~$ find . -name demo-01.txt
./ubuntu-commands/demo-01-dir/demo-01.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-stat/demo-01.txt
# ファイル名にスペースが入る場合など、クォーテーションマークでファイル名を囲うこともできます。
demo@demo-01-Ubuntu22:~$ find . -name "demo-01.txt"
./ubuntu-commands/demo-01-dir/demo-01.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-stat/demo-01.txt
# アスタリスクでワイルドカード検索を実施することも可能です。
demo@demo-01-Ubuntu22:~$ find . -name demo-0*.txt
./ubuntu-commands/demo-02-dir/demo-03.txt
./ubuntu-commands/demo-01-dir/demo-02.txt
./ubuntu-commands/demo-01-dir/demo-01.txt
./ubuntu-commands-touch/demo-02.txt
./ubuntu-commands-touch/demo-04.txt
./ubuntu-commands-touch/demo-03.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-touch/demo-05.txt
./ubuntu-commands-stat/demo-02.txt
./ubuntu-commands-stat/demo-01.txt
実行例2:ディレクトリ名も含めて検索したい場合
find <探索始点ディレクトリ> -path '<ディレクトリを含む検索パターン>'
<探索始点ディレクトリ>は、.
を指定すれば現在のディレクトリの中から、/
を指定すればルートディレクトリから探索を実行します。
-name
オプションがファイルのベースネームのみ指定可能であるのに対して、-path
オプションをつけるとディレクトリを含むパス表現で検索をかけることができます。(/
を含めて検索を実施することが可能です)
検索パターンはクォーテーションマークで囲う必要があります。
# どのディレクトリに含まれるかを知っている場合などに有用、ファイル名を含めることもできる
demo@demo-01-Ubuntu22:~$ find . -path './ubuntu-commands-touch/demo*'
./ubuntu-commands-touch/demo-02.txt
./ubuntu-commands-touch/demo-04.txt
./ubuntu-commands-touch/demo-01-link
./ubuntu-commands-touch/demo-03.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-touch/demo-05.txt
# -nameオプションではスラッシュを含めた表現は使用できない
demo@demo-01-Ubuntu22:~$ find . -name './ubuntu-commands-touch/demo*'
find: warning: ‘-name’ matches against basenames only, but the given pattern contains a directory separator (‘/’), thus the expression will evaluate to false all the time. Did you mean ‘-wholename’?
# -pathオプションは-wholenameオプションでも代用可能
demo@demo-01-Ubuntu22:~$ find . -wholename './ubuntu-commands-touch/demo*'
./ubuntu-commands-touch/demo-02.txt
./ubuntu-commands-touch/demo-04.txt
./ubuntu-commands-touch/demo-01-link
./ubuntu-commands-touch/demo-03.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-touch/demo-05.txt
実行例3:正規表現を使って検索したい場合
find <探索始点ディレクトリ> -regex <正規表現を含む検索パターン>
<探索始点ディレクトリ>は、.
を指定すれば現在のディレクトリの中から、/
を指定すればルートディレクトリから探索を実行します。
-name
オプションがファイルのベースネームのみ指定可能であるのに対して、-regex
オプションをつけるとディレクトリを含むパス表現で検索をかけることができます。(/
を含めて検索を実施することが可能です)
フルパスで検索が実行されるため、ファイル名だけを指定してもうまく検索できません。先頭に.*
をつけるなど、工夫が必要です。
# 最初に.*を指定するなどしてフルパス検索に対応できるようにする必要があることに注意
demo@demo-01-Ubuntu22:~$ find . -regex '.*demo-[0-9]+.*txt$'
./ubuntu-commands/demo-02-dir/demo-03.txt
./ubuntu-commands/demo-01-dir/demo-02.txt
./ubuntu-commands/demo-01-dir/demo-01.txt
./ubuntu-commands-touch/demo-02.txt
./ubuntu-commands-touch/demo-04.txt
./ubuntu-commands-touch/demo-03.txt
./ubuntu-commands-touch/demo-01.txt
./ubuntu-commands-touch/demo-05.txt
./ubuntu-commands-stat/demo-02.txt
./ubuntu-commands-stat/demo-01.txt
# フルパス検索なのでディレクトリ名も含めて正規表現を指定することができる
demo@demo-01-Ubuntu22:~$ find . -regex '.*ubuntu-commands-stat/.*demo-[0-9]+.*txt$'
./ubuntu-commands-stat/demo-02.txt
./ubuntu-commands-stat/demo-01.txt
参考文献:
- man findコマンド
- https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-find.html
- https://www.gnu.org/software/findutils/manual/html_node/find_html/Full-Name-Patterns.html
- https://qiita.com/nkojima/items/2af0558d3faf8a3063a8