この記事はソニックガーデン 若手プログラマ Advent Calendar 2024の9日目の記事です。
はじめに
Advent Calendarの流れでこの記事を読んでくれている方もいるかもしれませんが、おそらくこの記事に辿り着いた方は 「**/*」 という記法は何だと思った方だと思います。
結論を言うと 「linux glob」 と検索すればきっと欲しい情報が得られると思います。もちろんこの記事でも解説します
「**/*」 という記法は何と思った人向けて作成した記事です。
解説
早速この 「**/*」 記法について詳しく見ていきましょう。これは、主にLinuxやUnix系システムで使用されるファイルパターンマッチングの一種である「glob」の一部です。
wikipediaからの引用
グロブ(英: glob)とは主にUnix系環境において、ワイルドカードでファイル名のセットを指定するパターンのことである。
globは、ファイルやディレクトリを指定する際に便利な方法を提供します。基本的にワイルドカードを用いて、特定のパターンに一致するファイル名やディレクトリ名を簡潔に指定することができます。
例えば、「**/*」 というパターンは、次のように解釈されます
- ** これは、現在のディレクトリから再帰的にすべてのサブディレクトリを含むすべてのファイルやフォルダを対象にします。
- / ディレクトリを区切るためのスラッシュです。
- * 任意の文字列にマッチします。この場合、特定のディレクトリ内のすべてのファイルを指します。
実際に試してみよう
ごちゃごちゃ書きましたが、具体例を見た方が分かりやすいと思うので実際に試してみましょう。
任意のディレクトリに移動してターミナルで以下を実行してください
mkdir test-dir
mkdir test-dir/dir1
mkdir test-dir/dir2
mkdir test-dir/dir1/subdir1
mkdir test-dir/dir1/subdir2
mkdir test-dir/dir2/subdir1
touch test-dir/file1.rb
touch test-dir/file2.rb
touch test-dir/file1.txt
touch test-dir/file2.txt
touch test-dir/dir1/file3.txt
touch test-dir/dir1/subdir1/file4.txt
touch test-dir/dir1/subdir2/file5.txt
touch test-dir/dir2/file6.txt
touch test-dir/dir2/subdir1/file7.txt
そうすると以下のディレクトリ構成になります。
test-dir/
├── dir1
│ ├── file3.txt
│ ├── subdir1
│ │ └── file4.txt
│ └── subdir2
│ └── file5.txt
├── dir2
│ ├── file6.txt
│ └── subdir1
│ └── file7.txt
├── file1.rb
├── file2.rb
├── file1.txt
└── file2.txt
「**/*」 のパターンを使って、上記のディレクトリ構造でどのようにファイルを検索できるかを確認しましょう。以下のコマンドを試してみてください。
cd test-dir
ls **/*
このコマンドを実行すると、test-dirディレクトリ内のすべてのディレクトリとファイルがリストされます。「**/*」 パターンは、すべてのサブディレクトリを再帰的に探索し、その中のすべてのファイルを見つけることができます。
また、ちょっと応用して以下を実行してみます。
cd test-dir
ls **/*.rb
この場合、「**/*.rb」 パターンを使用して、すべてのサブディレクトリ内の .rb 拡張子を持つファイルを見つけることができます。
おわりに
この記事では、LinuxやUnix系環境で使用される「glob」パターンの一部である 「**/*」 記法について解説しました。初めて、「**/*」 この記法を見た人の疑問を解消できたら嬉しいです。
私自身実際に、「**/*」 この記法はなんだと思った経験からこの記事を書きました。具体的に遭遇した場面はテストフレームワークであるrspecについて学んでいる時に出会いました。この記事を読んだ方なら以下のコードがspec/support
配下の.rb
で終わるファイルを対象にrequire
していっているということが何となくわかると思います。
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
以上です。次回、ソニックガーデン 若手プログラマ Advent Calendar 2024の10日目は@yatsuhashi168さんです。お楽しみに!