WordPressで画像が表示されずに困っていて、blogs.dirというディレクトリを取り扱っている箇所を探そうとした。
$ grep -r blogs\.dir *.php
見つからない。そんなはずはないが…
検索の仕方
結論からすると、この書き方で検索ができた。
$ grep -r blogs\.dir --include=*.php
※検索したいのは blogs.dir という文字列で、拡張子が php のファイルを検索の対象にする。
wp-includes/ms-default-constants.php にこれを取り扱う処理が書かれていることを見つけられた。
環境はUbuntu 22.04だったが、Ubunt 18.04で試しても同じ結果になった。
やってみたこと
結局、コマンドへの引数の渡し方が間違っていることが分かる。
Super User / grep does not recurse for files with a specific extension
これを見ながら、渡したパラメーターで何が起きているのかを考えてみる。
シェルの展開機能が影響していた。
拡張子の指定なし
拡張子を指定しなければ、再帰的に検索ができる。
だが、WordPressのディレクトリなので、画像や動画などが大量に含まれており、検索にとても時間が掛かる。
$ grep -r blogs\.dir *
何が起きているのかだけれども、これって恐らくは * がファイル名に展開されている。
$ echo * favicon.ico index.php license.txt readme.html wp-activate.php ... wp-includes ...
※長いので省略。
この場合は、wp-includesというディレクトリも指定されたことになって、-rが働いて、サブディレクトリが検索される。
拡張子の指定あり
拡張子を指定すると、再帰的な検索ができない。
$ grep -r blogs\.dir *.php
でも実際には、再帰的な検索ができないのではなく、ディレクトリが検索対象になっていないだけ。
*.phpという指定なので、当然wp-includes等のディレクトリは展開されず、検索対象にならない。
$ echo *.php favicon.ico index.php license.txt readme.html wp-activate.php ...
※長いので省略。
これを確かめるために、wp-includesをwp-includes.phpに変更してみた。
これで検索ができた。
$ sudo mv wp-includes wp-includes.php $ echo * favicon.ico index.php license.txt readme.html wp-activate.php ... wp-includes.php ...
※長いので省略。
grepに対して正しくパラメーターを渡すことができていなかった、ということがはっきりした。
includes指定
*をgrepコマンドに渡すためには、includesというオプションが使える。
(excludeで除外するファイルを指定することもできるようだ)
includesについても、指定の仕方に注意が必要ではある。
指定の仕方を間違えると、*が展開されてしまう。
$ echo --includes=*.php --includes=*.php $ echo --includes \*.php --includes *.php $ echo --includes *.php --includes index.php wp-activate.php wp-blog-header.php wp-comments-post.php ...
※長いので省略。
grepコマンドに正しく *.php を渡すためには、シェルに * が展開されないような渡し方をする必要がある。
ということで、*を*のままで渡すことができれば良いのだから、冒頭に書いた、
$ grep -r blogs\.dir --include=*.php
は、
$ grep -r blogs\.dir --include \*.php
と指定しても動く。
さいごに
前々から気になっていたのに、ちゃんと理解しないままに使っていて、WordPressはどこでblogs.dirを操作しているのか分からなかった。
検索、検索…これじゃない、あれじゃない、と時間をかなり無駄に溶かしてしまった。
気になったことは、その時にちゃんと確認して答えを出しておくべきだった…
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他