36.ファイルを検索する、findコマンド、locateコマンド。何のファイルか調べる、fileコマンド。
ナックス「熟練のプログラマー達の間にはこんな格言があります」
ナックス「『おっぱい画像を100枚集めるプログラムを作らなければ一流の変態とは認めない』!」
デビー君「!!??」
ナックス「さて、もちろん一流の変態を目指しているデビー君。早速──」
デビー君「いやいやいやいや!一流のプログラマーとか一流のハッカーとかなら分かるけど変態は目指してないよ!?」
ナックス「え?デビー君は一流の人間にはなりたくないのですか?」
デビー君「いや、そりゃ一流の人間にはなりたいさ」
ナックス「では一流の変態を目指すことになんの異議があろうか」
デビー君「異議ありまくりだよ!」
ナックス「冗談はともかくとして、おっぱい画像を100枚集めるプログラムを作るというのは話のネタ作りにヒマなプログラマーが時々やっています」
ナックス「プログラムの勉強にもなるので、これから私と一緒に作っていきましょう」
ナックス「画像を大量に使って出来るだけ分かりやすい解説を心がけている当サイト」
ナックス「というわけで、エロ画像もばんばん使います!」
ナックス「などというようなことを計画していました。先週の土曜日までは──」
デビー君「え?何かあったの?」
ナックス「先週の土曜日。あろうことか私はお腹をこわしました!!」
デビー君「!!」
ナックス「お腹をさすりながらトイレで私は神様に祈りました。『サイトでエロ画像を使うなどという道義に反した行為は決していたしませんから!!』」
デビー君「…………」
ナックス「無事にお腹の調子も良くなってきた今日この頃。というわけで、当サイトでは基本的にはパソコンのデスクトップの壁紙を集めるプログラムを軸としつつ、応用すれば簡単におっぱい画像を集められるプログラムを作成する。ということにしました」
ナックス「それが、トイレの神様とペンギンとの固い男の約束!」
デビー君「トイレの神様って男なんだ……」
ナックス「使うプログラムはシェルスクリプト。画像はどこかの画像検索サイトを利用していく予定です」
デビー君「え?シェルスクリプトで画像を100枚集められるの?」
ナックス「集められるんじゃないかなぁ……、という希望的観測を持っています」
デビー君「え!?実際に作って集められる事を確認してないの!?」
ナックス「してません。当サイトは常に行き当たりばったりです。『おしいところまで作れたけど、結局無理だったね』っていうことも大いにありえます。そんな時は当サイト管理人にこう書いたメールを送って非難しましょう」
ナックス「『どんまい』」
デビー君「非難してない!むしろ励ましてる!」
ナックス「さて。今日は前準備としてnanoエディタの設定ファイルでnanoの設定をグリグリと書き換えます」
デビー君「え?nanoエディタにも設定ファイルってあるの?」
ナックス「あります。まずはman nanoでnanoエディタの説明を見てみましょう」
$ man nano
デビー君「英語か……」
ナックス「↑キーと↓キーでページがスクロール出来ます。一番下に」
SEE ALSO nanorc(5) /usr/share/doc/nano/ (or equivalent on your system)
ナックス「『こいつもチェックしてみな nanorc(5)』と書かれています。rcと名前につけば、大体設定ファイルです」
ナックス「Qキーを押してmanコマンドを終了させます」
Qキーを押す
ナックス「次にman nanorcでnanorcの説明を見ます」
$ man nanorc
ナックス「ここにnanorcファイルの書き方などが書かれています。これを見ながら好みの設定に変えることが出来ます」
ナックス「下の方を見ると以下の様に書かれています」
FILES SYSCONFDIR/nanorc System-wide configuration file ~/.nanorc Per-user configuration file SEE ALSO nano(1) /usr/share/doc/nano/examples/nanorc.sample (or equivalent on your system)
ナックス「FILESには、nanorcをどの場所に置けばいいかが書かれているようです。今回は二つ目の、ホームディレクトリに.nanorcファイルを置く方法をとりましょう」
ナックス「さらにSEE ALSO(こいつもチェックしてみな)に、なにやらファイルの場所が書かれています」
/usr/share/doc/nano/examples/nanorc.sample
デビー君「/usr/share/doc/nano/examples/って覗いたことのないディレクトリだね。ファイル名はnanorc.sample。『nanorcのサンプル』?」
ナックス「こいつは要チェックです。Qキーでmanコマンドを終了して」
Qキーを押す
ナックス「まずnanorc.sampleファイルが何のファイルなのか、念のためfileコマンドで調べてみます」
$ file ファイル名
デビー君「fileコマンド?」
ナックス「これを実行した場合、対象のファイルがテキストファイルである場合は text と表示されます。つまり、テキストエディタ(nanoとか)で開けるファイル。逆に text と表示されない場合はテキストエディタで開けないファイルということになります」
$ file /usr/share/doc/nano/examples/nanorc.sample
$ file /usr/share/doc/nano/examples/nanorc.sample /usr/share/doc/nano/examples/nanorc.sample: ERROR: cannot open `/usr/share/doc/nano/examples/nanorc.sample' (No such file or directory)
ナックス「はい。どう見ても『そんなファイルは無いよ』って出てきてます。Debianのバカ!」
ナックス「はい。nanorcの設定などという茶番は諦めて次回にします」
デビー君「えぇっ!?」
ナックス「今日はファイルの検索の基本。findコマンドとlocateコマンドを解説致します」
ナックス「コマンドの設定ファイルが基本の置き場所にない、というのは良くある話です。皆さんも『ディストリビューションごとに設定ファイルの置き場所が違う』などという話を聞いたことがあるのではないでしょうか」
ナックス「findコマンドとlocateコマンドはそんなLinuxユーザーの強い味方です。早速これらを使ってどこかにいる(はずの)nanorc.sampleファイルを探しだしましょう」
ナックス「find コマンドはファイル検索の基本ですが、学び始めると様々なオプション、多彩な探し方など奥が深すぎます。今回はもっとも基本的な探索方法の一例をご紹介致します」
find 検索を開始するディレクトリ -name ファイル名
ナックス「findコマンドは一般ユーザーでももちろん使用することができますが、rootユーザーになって使用することで、一般ユーザーでは入ることの出来ないディレクトリの中まで調べることが出来ます。というわけで、少々時間はかかりますがrootユーザーとなり、rootディレクトリからnanorc.sampleを根こそぎ調べたいと思います」
$ su - パスワード: # find / -name nanorc.sample
ナックス「あとはボーッと待っておけばファイルが見つかると自動的にその場所を表示してくれます」
$ su - パスワード: # find / -name nanorc.sample #
デビー君「あれ?ナックス。なんか、コマンドが終わったみたいだけど何も表示されないよ?」
ナックス「Debianのバカ……」
ナックス「いいですか皆さん。manコマンドが教える情報などというものはクソ喰らえです。基本的に信じないでください」
デビー君「おーっとナックス。爆弾発言」
ナックス「ディストリビューションによっては『参考にしてくださいというファイル』のファイル名すら変更されている場合があります。検索キーワードに正規表現を使い、とりあえずnanorcというキーワードがつくファイルを全て検索します。正規表現を使う場合は対象のファイル名を"(ダブルクォーテーション)でくくります。正規表現には例の * を使いましょう」
# find / -name "*nanorc*"
デビー君「あ。何か出た」
# find / -name "*nanorc*" /usr/share/nano/mutt.nanorc /usr/share/nano/groff.nanorc /usr/share/nano/sh.nanorc /usr/share/nano/patch.nanorc /usr/share/nano/python.nanorc /usr/share/nano/ruby.nanorc /usr/share/nano/java.nanorc /usr/share/nano/tex.nanorc /usr/share/nano/pov.nanorc /usr/share/nano/c.nanorc /usr/share/nano/man.nanorc /usr/share/nano/perl.nanorc /usr/share/nano/nanorc.nanorc /usr/share/nano/asm.nanorc /usr/share/nano/html.nanorc /usr/share/man/man5/nanorc.5.gz /usr/share/man/fr/man5/nanorc.5.gz /usr/share/vim/vim71/syntax/nanorc.vim /usr/share/vim/vim71/ftplugin/nanorc.vim /etc/nanorc
ナックス「(あったー……良かったー……)さて、目的のブツはnanorc.sampleなのですが、まったく同じ名前のものはないようです。が、今回の目的はnanoのサンプルなので、ディレクトリ名からして/usr/share/nano/ディレクトリ以下のどれかだろう、と」
ナックス「で。ファイル名からして一番無難なnanorc.nanorcでしょう。他のは何かプログラミング言語名.ファイル名になってるし。たぶん」
デビー君「多分て……」
ナックス「とりあえずfileコマンドでnanorc.nanorcをチェックしてみます」
$ file /usr/share/nano/nanorc.nanorc
$ file /usr/share/nano/nanorc.nanorc /usr/share/nano/nanorc.nanorc: ASCII text, with very long lines
ナックス「textという文字が入っているのでテキストファイルです。with very long lines(ってかメッチャ長い文が書かれた行があるよ!)って書かれてますね」
ナックス「中を見てみます」
$ nano nanorc.nanorc
## Here is an example for nanorc files. ## syntax "nanorc" "\.?nanorc$" ## Possible errors and parameters icolor brightwhite "^[[:space:]]*((un)?set|include|syntax|i?color).*$" ## Keywords icolor brightgreen "^[[:space:]]*(set|unset)[[:space:]]+(autoindent|backup|backupdir|backwards|boldtext|brackets|casesensitive|const|cut|fill|historylog|matchbrackets|morespace|mouse|multibuffer|noconvert|nofollow|nohelp|nonewlines|nowrap|operatingdir|preserve|punct)\>" "^[[:space:]]*(set|unset)[[:space:]]+(quickblank|quotestr|rebinddelete|rebindkeypad|regexp|smarthome|smooth|speller|suspend|tabsize|tabstospaces|tempfile|view|whitespace|wordbounds)\>" icolor green "^[[:space:]]*(set|unset|include|syntax)\>" ## Colors icolor yellow "^[[:space:]]*i?color[[:space:]]*(bright)?(white|black|red|blue|green|yellow|magenta|cyan)?(,(white|black|red|blue|green|yellow|magenta|cyan))?\>" icolor magenta "^[[:space:]]*i?color\>" "\<(start|end)=" ## Strings icolor white ""(\\.|[^"])*"" ## Comments icolor brightblue "^[[:space:]]*#.*$" icolor cyan "^[[:space:]]*##.*$"
ナックス「一番上にコメントで## Here is an example for nanorc files.(ここにあるのはnanorcファイルのための例だよ)と書かれています。どうやらこれっぽいですね」
ナックス「さて、書き換えたりせずに終了してください」
ナックス「うーん、でも色をつけたいだけなのに、どうやらこれは色のサンプルの設定ファイルだな……。ということは書き換えたい目的の設定ファイルはこっちじゃなくて/etc/nanorcか……」
ナックス「さて。findコマンドを今回使ってみてどうでしたか?」
デビー君「メチャクチャ時間がかかったよ」
ナックス「そうです。しかも、rootディレクトリから検索したい場合はrootユーザーにならないといけないという、ちょっと使いづらいコマンド。ということで登場するのがlocateコマンドだ」
ナックス「locateコマンドが無いという方は一刻も早くyumなりaptitudeなりを使ってインストールするんだ」
ナックス「インストールは終わったか!?」
デビー君「終わりましたー!」
ナックス「ではまず以下の様にコマンドを打て!」
# updatedb
デビー君「ん?なんだ、このコマンドは?locateなんて文字が一つもないじゃないか」
ナックス「locateコマンドは、事前に全てのファイルやディレクトリの場所の情報をデータベースに登録しておく事で使います。updatedbはデータベースの更新です。一番最初だけ時間がかかりますが、次回からは新しく変更があった箇所だけデータベースを更新するので、(もしやる場合)二回目以降はほとんど時間がかかりません」
「っていうか、そもそも最初にupdatedbをやっちゃえばそんなに激しくファイルやディレクトリの場所なんて入れ替わらないので、updatedbをしなくてもlocateコマンドだけで大体ファイルがどこにあるかは探せます。そうそう。updatedbコマンドの実行はrootユーザーでね」
ナックス「さて、locateコマンドの使い方は以下のような感じです」
$ locate パターン
ナックス「例えば今回だとこんな感じですね」
$ locate nanorc /etc/nanorc /usr/share/man/fr/man5/nanorc.5.gz /usr/share/man/man5/nanorc.5.gz /usr/share/nano/asm.nanorc /usr/share/nano/c.nanorc /usr/share/nano/groff.nanorc /usr/share/nano/html.nanorc /usr/share/nano/java.nanorc /usr/share/nano/man.nanorc /usr/share/nano/mutt.nanorc /usr/share/nano/nanorc.nanorc /usr/share/nano/patch.nanorc /usr/share/nano/perl.nanorc /usr/share/nano/pov.nanorc /usr/share/nano/python.nanorc /usr/share/nano/ruby.nanorc /usr/share/nano/sh.nanorc /usr/share/nano/tex.nanorc /usr/share/vim/vim71/ftplugin/nanorc.vim /usr/share/vim/vim71/syntax/nanorc.vim
デビー君「おぉ!結果が早い」
ナックス「検索開始位置を指定しなくても、最初から全てのディレクトリを検索してくれます。また、正規表現などを使わなくても単純に nanorc とつくファイル名を検索してくれます」
ナックス「更に『実際に一般ユーザーが覗けない箇所まで探しにいく』のではなく、データベースからの検索ですので一般ユーザーからの使用で一般ユーザーが覗けない箇所のファイルも検索可能です」
ナックス「というわけで、時代は確実にlocateの時代なのだよ」
ナックス「次回!nanorc設定ファイルの編集(37.nanoエディタの設定ファイル、nanorcをいじる)!」