SSブログ
ファイル操作・管理 ブログトップ

ディレクトリの中身をリストする (lsコマンド) [ファイル操作・管理]

 さて。

 概略的な話が長引いたので、気分転換(??)にコマンドの紹介をしてみる。

 ファイル操作・管理系のコマンドとして基本中の基本であるところの、「ls」コマンドから。実はすでに何度と無く使用しているのだけども。(笑)
 このコマンドの「書式」は次のとおり。

 ls [オプション] [対象となるファイルやディレクトリ...]

 lsコマンドに続けて、オプションや処理対象が指定できる。ただし、オプションも処理対象も省略可能。両方記述することも、両方省略することも、どちらか一方だけ指定することも自由自在に可能となっている。

 それでは、実際にコマンドを使用してみよう。(…とはいっても実は実際に使っていたのだが)

 まず、何も指定せずにlsコマンドだけで実行すると…
[piro791@kagami ~]$ ls
hoge  lesson1.txt

 lsコマンドに、処理対象となる引数を何も指定しなかった場合は、「現在のディレクトリ」が処理対象となる。「現在のディレクトリ」は「カレントディレクトリ」とも呼ばれる。なお、「現在のディレクトリ」という用語についてはこの後のアーティクルで説明したい。

 lsコマンドに何もオプションを指定しなかった場合は、「表示可能なファイルの名前」のみを表示する。「表示可能なファイルの名前」とは、ファイルの名前がピリオドで始まるファイル以外のことをいう。

 lsコマンドのオプションのうち、よく使われるものを紹介する。

 まずは「-l」オプション。これは、ファイルの一覧表示に詳細な情報をあわせて表示する。表示される内容は、ファイルのモード、リンクの数(後述)、所有者名、グループ名、ファイルの(バイト単位の)大きさ、タイムの最終更新日時、そしてファイルの名前である。また、ファイルの一覧表示に先立って、そのディレクトリが使用しているディスク容量の合計を集計表示する。「total blocks」あるいは「合計」という内容がそれである。が、今は気にしなくても良い。

 試してみよう。
 さきほどオプションも引数も何も指定しないでlsコマンドを実行したが、今度は「-l」オプションを実際につけて実行してみよう。
[piro791@kagami ~]$ ls
hoge  lesson1.txt
[piro791@kagami ~]$ ls -l
合計 8
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 15:14 lesson1.txt

 ファイルが2個あるが、「-l」オプションをつけてからは、それぞれのファイル名に加えていろいろな情報が追加表示された。これが「-l」オプションの効能である。

 続いて、「-a」オプション。これは、ファイル名がピリオド「.」で始まるファイル名も表示の対象に含める…というもの。なお、Windows(やMS-DOS等)にはファイルの属性に「隠しファイル」なるものがあるが、UNIX/Linuxにはそういった発想が無い。そのかわり、ファイル名がピリオド「.」で始まるファイル名については「隠しファイル」に準じる動作をするようになっている。(歴史的な経緯が…って奴ね)

 では、こちらも試してみよう。
 lsコマンドをオプション何もなしで実行したときと、「-a」オプションを指定したときとでの違いを見てみよう。
[piro791@kagami ~]$ ls
hoge  lesson1.txt
[piro791@kagami ~]$ ls -a
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  hoge  lesson1.txt

 このように、「-a」オプションのある・なしで表示されるファイルの数が変動していることがわかる。

 オプション類は、その動作が矛盾しない限り、複数のオプションを同時に指定することが出来る。
 「-l」オプションと「-a」オプションとは動作が矛盾しないので同時に指定することが出来る。
 こんな具合になる。
[piro791@kagami ~]$ ls -l -a
合計 40
drwx------ 2 piro791 piro791 4096  1月 18 11:58 .
drwxr-xr-x 3 root    root    4096  1月  6 12:46 ..
-rw------- 1 piro791 piro791  836  1月 19 17:20 .bash_history
-rw-r--r-- 1 piro791 piro791   33  1月  6 12:46 .bash_logout
-rw-r--r-- 1 piro791 piro791  176  1月  6 12:46 .bash_profile
-rw-r--r-- 1 piro791 piro791  124  1月  6 12:46 .bashrc
-rw------- 1 piro791 piro791   35  1月 19 17:18 .lesshst
-rw-rw-r-- 1 piro791 piro791    7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt

 ファイルについて詳しい情報が表示される…という「-l」オプションの効能と、ファイル名がピリオド「.」で始まるファイルも表示内容に含める…という「-a」オプションの効能とが同時に発揮されていることがわかる。

 また、時と場合によって重宝するオプションとしては、「-r」オプションがある。これは、ファイルの一覧を表示する際、一定の法則でソート(並び替え)をして表示されるのだが、そのソートを逆順にソートして出力する…というもの。

 「一定の法則で」とぼかして書いたが、ソートの法則を決めるオプションを別途指定したときにその法則が利いてくる。それらのオプションを省略した場合は、通常ファイル名の順番で表示される。(つまり、abc...の順)

 試してみよう。「-l」オプションだけで実行した場合と、「-l」オプションと「-r」オプションを組み合わせたときの表示結果。
[piro791@kagami ~]$ ls -l
合計 8
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 15:14 lesson1.txt
[piro791@kagami ~]$ ls -l -r
合計 8
-rw-rw-r-- 1 piro791 piro791 7  1月 15 15:14 lesson1.txt
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge

 「-l」だけの場合は、hoge → lesson1.txtの順で表示されている。ABC順ではhがlよりも先にくるからである。
 一方で「-l」と「-r」とを組み合わせた場合はlesson1.txt → hogeの順に表示されている。ABCの順序が逆に並べなおされていることが判るだろう。

 ファイルのソート順を変更するオプションも一緒に紹介しよう。「-t」オプションは、ファイルを表示する際にファイルの最終更新日時の新しい順に表示するようになる。

 「-l」と「-a」オプションを同時に指定した場合と、さらに「-t」オプションを追加した場合を見てみよう。
[piro791@kagami ~]$ ls -l -a
合計 40
drwx------ 2 piro791 piro791 4096  1月 18 11:58 .
drwxr-xr-x 3 root    root    4096  1月  6 12:46 ..
-rw------- 1 piro791 piro791  836  1月 19 17:20 .bash_history
-rw-r--r-- 1 piro791 piro791   33  1月  6 12:46 .bash_logout
-rw-r--r-- 1 piro791 piro791  176  1月  6 12:46 .bash_profile
-rw-r--r-- 1 piro791 piro791  124  1月  6 12:46 .bashrc
-rw------- 1 piro791 piro791   35  1月 19 17:18 .lesshst
-rw-rw-r-- 1 piro791 piro791    7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt
[piro791@kagami ~]$ ls -l -a -t
合計 40
-rw------- 1 piro791 piro791  836  1月 19 17:20 .bash_history
-rw------- 1 piro791 piro791   35  1月 19 17:18 .lesshst
drwx------ 2 piro791 piro791 4096  1月 18 11:58 .
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt
-rw-rw-r-- 1 piro791 piro791    7  1月 15 13:02 hoge
drwxr-xr-x 3 root    root    4096  1月  6 12:46 ..
-rw-r--r-- 1 piro791 piro791   33  1月  6 12:46 .bash_logout
-rw-r--r-- 1 piro791 piro791  176  1月  6 12:46 .bash_profile
-rw-r--r-- 1 piro791 piro791  124  1月  6 12:46 .bashrc

 表示の順序が変化しているのがわかる。「-t」オプションをつけた場合、ファイル名の並びという観点ではバラバラになっているように見えるが、日付・時刻のところに着目すると、新しいファイルが上に、古いファイルが下に表示されるようになっていることがわかる。

 これを「-r」オプションをつけてさらに試してみる。すると…
[piro791@kagami ~]$ ls -l -a -t -r
合計 40
-rw-r--r-- 1 piro791 piro791  124  1月  6 12:46 .bashrc
-rw-r--r-- 1 piro791 piro791  176  1月  6 12:46 .bash_profile
-rw-r--r-- 1 piro791 piro791   33  1月  6 12:46 .bash_logout
drwxr-xr-x 3 root    root    4096  1月  6 12:46 ..
-rw-rw-r-- 1 piro791 piro791    7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt
drwx------ 2 piro791 piro791 4096  1月 18 11:58 .
-rw------- 1 piro791 piro791   35  1月 19 17:18 .lesshst
-rw------- 1 piro791 piro791  836  1月 19 17:20 .bash_history

 表示結果がまた変化した。今度は日付・時刻が古いファイルが上に、新しいファイルが下に表示されるようになった。

 他にもファイルの状態を変更した日時とか、ファイルにアクセス(読み取り)した日時とかでもソートできるが、ここでの説明はひとまず割愛する。

 続いてよく使うオプションに「-d」オプションがある。これは、ディレクトリの「中身」ではなく、他のファイルと同様にディレクトリそのものを表示する…というもの。

 オプションを全て省略した場合と、「-d」オプションのみをつけた場合とで比較してみよう。
[piro791@kagami ~]$ ls
hoge  lesson1.txt
[piro791@kagami ~]$ ls -d
.

 「-d」オプションを指定した場合、ただ1文字ピリオド「.」のみが表示された。
 なんのこっちゃ?   という人もいるかもしれないが、続けて「-l」オプションをつけて試してみよう。
 すると…
[piro791@kagami ~]$ ls -l
合計 8
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 15:14 lesson1.txt
[piro791@kagami ~]$ ls -l -d
drwx------ 2 piro791 piro791 4096  1月 18 11:58 .

 表示された内容が変化していることは判るが、これでも「なんのこっちゃ?」という人がいるかもしれない。実は、このピリオド「.」だけの表示が『現在のディレクトリ』そのものを示しているのであった。「-d」オプションを省略した場合、lsコマンドはこのアーティクルのタイトルにあるような動作…つまり「ディレクトリの中身をリストする」という動作をする。しかし、「-d」オプションをつけた場合は中身ではなくディレクトリそのものをリストするのであった。

 たとえ話に置き換えると…
   「10番の引き出しを見せて~!」と依頼したとする。

 「-d」オプションが無い場合は、10番の引き出しの中身がずらっと見えるということ。(引き出しを開ける)
 「-d」オプションが有る場合は、10番の引き出しの外側が見えるということに。(引き出しを開けない)

 この違いが判ってもらえるだろうか。引き出しを開けるのか開けないのかの違い…と理解してもらうのが手っ取り早いと思う。




 オプションに続いて、引数の部分について解説する。
 lsコマンドには、どのファイルやディレクトリを処理すべきか指示を与えることが出来る。上記のオプションの解説については全て省略してきた。この場合はすでに述べたとおり「現在のディレクトリ」が処理対象となる。
 一方、処理すべきファイルやディレクトリが与えられた場合はそのファイルやディレクトリについてファイルの一覧や詳細な情報を表示するようになる。
 ファイルを指定してみよう。「-l」オプションを併用しているが、ファイルを何も指定しなかった場合と、ファイル「hoge」を指定した場合との違いを見て欲しい。
[piro791@kagami ~]$ ls -l
合計 8
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 15:14 lesson1.txt
[piro791@kagami ~]$ ls -l hoge
-rw-rw-r-- 1 piro791 piro791 7  1月 15 13:02 hoge

 「hoge」を指定した場合、そのファイルしか表示されなくなった。

 また、引数にファイルではなくディレクトリを与えた場合はどうか。ここでは、もともとUNIX/Linuxに備わっているディレクトリである、「/bin」というディレクトリを指定してみよう。「-l」オプションを併用している。すると…
[piro791@kagami ~]$ ls -l /bin
合計 7424
-rwxr-xr-x 1 root root    4988  9月  4 04:55 arch
lrwxrwxrwx 1 root root       4 11月 19 17:09 awk -> gawk
-rwxr-xr-x 1 root root   18484 10月 27 11:12 basename
-rwxr-xr-x 1 root root  735004  1月 22  2009 bash
-rwxr-xr-x 1 root root   23132 10月 27 11:12 cat
-rwxr-xr-x 1 root root   41828 10月 27 11:12 chgrp
-rwxr-xr-x 1 root root   38564 10月 27 11:12 chmod
-rwxr-xr-x 1 root root   44020 10月 27 11:12 chown
-rwxr-xr-x 1 root root   71524 10月 27 11:12 cp

 実際にはもっと沢山表示されるのだが、長すぎるので省略している。実際の表示結果については各自で試してみてもらいたい。
 とにかく、今まで見たことも無いファイルがずら~っと表示されたことには違いない。これは、「/bin」というディレクトリに保存されているファイルの一覧なのである。

 では、ここで「-d」オプションも試してみよう。先ほどの「ls -l /bin」に「-d」オプションをつけてみる。すると…
[piro791@kagami ~]$ ls -l -d /bin
drwxr-xr-x 2 root root 4096  1月 19 04:09 /bin

 このように、/binというディレクトリそのものが表示された。この違いが、引き出しを開けた/開けないの違いにあるということ。判ったかな?


まとめ:
 ・lsコマンドは、「ディレクトリの中身をリスト(一覧表示)する」コマンドである。

 ・lsコマンドでよく使うオプションは…
  
-lファイル名の他にファイルの詳しい情報も一緒に表示する
-aピリオドで始まるファイル(通常は表示されない)も表示する
-tファイル名の順でなく、ファイルの最終更新日時の新しい順にソートして表示する
-rソートの順番を逆にする
-dディレクトリの中身ではなく、ディレクトリそのものを表示する


 ・lsコマンドに引数を指定した場合、その指定したファイルやディレクトリが表示の対象となる。
 ・lsコマンドの処理対象はファイルでもディレクトリでも構わない。

ファイルにまつわる情報 [ファイル操作・管理]

 さて。
 開始早々viの使い方を説明した。慣れない内は相当苦戦すると思うので、出来るだけ積極的に使って慣れるようにしておいてほしい。

 では、いよいよ本題に進むことにする。

 「サーバ管理者」の役割ってなんですか?

 という問いかけを突き詰めると、「ファイルを管理することですよ」と答えることができるかもしれない。まあ、他にも
  ・ユーザーアカウントの管理
  ・プロセスの管理
  ・OSやアプリケーション(ミドルウェア・デーモンプロセス)の管理
  ・ハードウェア・ディスクの管理
 とかいろいろ挙げられるけども、もっとも大きなウェイトを占めるのは「ファイルの管理」ではないかと思う。つまり、この「ファイルの管理」という役割を果たすために必要な操作、つまり「ファイルの操作」の知識はサーバ管理者として最も重要な知識であると言っても過言ではない。

 よって、まず最初にこの「ファイルの操作」についてみっちり覚えてもらわなければならない。

1.ファイルにまつわる情報~lsコマンドで確認できること~

 それでは、サーバにログインしたら、ターミナルから「ls -la」とコマンドを実行してもらいたい。
[piro791@kagami ~]$ ls -la
合計 36
drwx------ 2 piro791 piro791 4096  1月 15 15:14 .
drwxr-xr-x 3 root    root    4096  1月  6 12:46 ..
-rw------- 1 piro791 piro791  149  1月 15 19:24 .bash_history
-rw-r--r-- 1 piro791 piro791   33  1月  6 12:46 .bash_logout
-rw-r--r-- 1 piro791 piro791  176  1月  6 12:46 .bash_profile
-rw-r--r-- 1 piro791 piro791  124  1月  6 12:46 .bashrc
-rw-rw-r-- 1 piro791 piro791    7  1月 15 13:02 hoge
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt

 こんな内容が表示されたのではないかと思う。表示される情報はもっと多かったり少なかったりするかもしれないが、とりあえず数行表示されればOK。

 各行ではなく、各カラムごとに注目してみよう。
 まず、一番左側(各行の最初のカラム)の固まりから。
  「drwx------」とか、「-rw-------」とか、「-rw-r--r--」とか、「-rw-rw-r--」とかいう表示が見える。この部分は、「ファイルのモード・権限情報」を記号で表している部分。この表示内容によって、
  ・それはファイルですか?ディレクトリですか?
  ・そのファイルを読める人は誰ですか?書き込める人は誰ですか?
 というような情報を読み取ることができるようになる。

 空白を置いてから、数字がポロッとある。上記の表示例では「2」とか「3」とか「1」とか出ている部分。これは、「リンク数」という情報を示している。「リンク」については別途アーティクルを改めて紹介するので、今はそれほど気にしなくても良い。

 さらに空白を置いてから表示されているのは、「ファイルの所有者」である。このファイルの持ち主がここでわかる。
 上記の表示例では、同じ名前が2回続けて表示されているが、最初のもの(左側のもの)が今紹介した「ファイルの所有者」で、その後(右側)に表示されているのが「グループ名」である。今はアカウント名(所有者名)とグループ名が同一のものになっているが、サーバ管理者の管理ポリシーによってはグループ名は他の表示になっているかもしれない。

 空白を置いてからさらに表示されているのは、「ファイルのサイズ(バイト数)」である。ファイルの大きさがここでわかるのである。

 サイズの後ろには、そのファイルの「タイムスタンプ」が表示される。「タイムスタンプ」とは、そのファイルが作成されたり、最後に更新されたりした日時のことである。

 そして、空白を置いて最後に表示されているのは「ファイルの名前」である。これは見れば判ると思うが。

2.ファイルのモードと権限の情報について~いわゆる「パーミッション」~

 lsコマンドでざっとファイルの状態を見てもらったが、先ほどの表示内容の中でとても重要な情報として「ファイルのモード・権限情報」が挙げられる。この部分の読み方をきちんと覚えてもらう必要がある。

 まず、先頭の1文字と、後ろの9文字とに分けることができる。色分けするとこんな感じ。

 「-rw-r--r--

 先頭の1文字(上記表示例で赤い部分)は、ファイルのモードをあらわしている。

 ごく普通のファイル-
 ディレクトリd
 リンクファイルl
 ブロックデバイスb
 キャラクタデバイスc

 ざっとこんな感じになっている。多いのは「-」「d」「l」くらいか。
 先ほどのlsコマンド実行例の場合、最初の2行「.」と「..」だけこの部分が「d」と表示されていた。これによって、「.」と「..」はディレクトリであることがわかる。

 続く9文字の部分(上記表示例で青い部分)は、そのファイル(やディレクトリやリンクファイル…)に対するアクセスの許可情報をあらわしている。この9文字の部分は、さらに3文字ずつ3分割して見る必要がある。

 「rw-r--r--

 最初の3文字(青い部分)は、ファイルの持ち主に許されたファイルへのアクセス権限である。続く3文字(緑色の部分)は、ファイルのグループ名表示と同じグループに所属する人に許されたファイルへのアクセス権限である。そして最後の3文字(ピンク色の部分)は、アカの他人に許されたファイルへのアクセス権限となっている。

 そして、それぞれの人が何を出来るのか…という情報がこの3文字に込められている。
 この3文字の中に登場する情報としては、
 そのファイルを読めるr
 そのファイルに書き込めるw
 そのファイルを「実行」できるx
 という意味がある。
 たとえば3文字の表示が「r--」だった場合、その人はそのファイルに対して
  ・そのファイルを読める
  ・そのファイルには書き込めない
  ・そのファイルは実行できない
 という許可情報を持っていることになるし、「rw-」だった場合は、その人はそのファイルに対して
  ・そのファイルを読める
  ・そのファイルに書き込める
  ・そのファイルは実行できない
 という許可情報を持っていることになる。「---」だった場合は、その人はそのファイルに対して
  ・そのファイルは読めない
  ・そのファイルには書き込めない
  ・そのファイルは実行できない
 と、要するに「アクセス禁止」状態にあることになる。

 ところで、「実行できる」とか「実行できない」とか何なんだろうか?
 これは、そのファイルが「実行可能ファイル」という形式のファイル、または「シェルスクリプト」とか「perlスクリプト」とかいった、何らかのプログラムされたファイルである場合に意味を持つ。

 UNIX/Linuxの場合、多くのコマンドはこうした「実行可能ファイル」の形式で提供されている。OSはこれを読み込んでメモリの上に展開し、それを実行することで様々な機能を提供している。たとえば今回使った「ls」コマンドも、前回使った「vi」コマンド、そしてその前に使った「passwd」コマンドなども全て「実行可能ファイル」の形式で提供されている。
-rwxr-xr-x 1 root root  95116 10月 27 11:12 /bin/ls
-rwxr-xr-x 1 root root 594740  9月 20 06:24 /bin/vi
-rwsr-xr-x 1 root root  22984  1月  7  2007 /usr/bin/passwd

 1行目のlsコマンドは許可情報が「rwxr-xr-x」と表示されている。「x」が付いているので、コマンドとして実行できるファイルであることがわかる。viもpasswdも同様。(passwdには見慣れない「s」が付いているが、今は気にしないように)

 一方で、前アーティクルまででviの練習で使用していた「lesson1.txt」というファイルはというと…
-rw-rw-r-- 1 piro791 piro791    7  1月 15 15:14 lesson1.txt

 これはごく普通のファイルなので(コマンドではないので)「x」がそもそも付いていない。よって、「ls」とか「vi」とかのようにコマンドとして入力しても実行されないのである。
[piro791@kagami ~]$ ./lesson1.txt
-bash: ./lesson1.txt: 許可がありません

 このように、「実行権が無い」のでエラーになってしまう。

 許可情報の部分的な見方がわかったところで、おさらいしてみよう。

 「-rw------- 1 piro791 piro791 149 1月 15 19:24 .bash_history」
 このファイルは、
  ・piro791さん(所有者)は読める / 書き込める / 実行はできない
  ・piro791グループに所属するpiro791さん(所有者)以外の人は、読めない / 書き込めない / 実行できない
  ・その他の人は、読めない / 書き込めない / 実行できない

 ということが判る。要するに、piro791さん(所有者)だけがアクセスできるファイルですよ…ということ。

 「-rw-r--r-- 1 piro791 piro791 124 1月 6 12:46 .bashrc」
 このファイルは、
  ・piro791さん(所有者)は読める / 書き込める / 実行はできない
  ・piro791グループに所属するpiro791さん(所有者)以外の人は、読める / 書き込めない / 実行できない
  ・その他の人は、読める / 書き込めない / 実行できない

 ということに。要するに、誰でも読めるが書き込めるのはpiro791さん(所有者)だけよ…ということ。

 「-rwxr-xr-x 1 root root 95116 10月 27 11:12 /bin/ls」
 このファイルは、
  ・rootさん(所有者)は読める / 書き込める / 実行できる
  ・rootグループに所属するrootさん(所有者)以外の人は、読める / 書き込めない / 実行できる
  ・その他の人は、読める / 書き込めない / 実行できる

 ということに。まあ、lsコマンドそのものなので、誰でも実行できる(実行するためには読み取れる必要がある)けど、変更できるのはrootさん(所有者)だけよ…ということ。

 コマンドのファイルを知らない人に書きかえられちゃうととんでもないことになるからね!!

いきなりの難問の続き~続・viの操作に慣れてもらおう~ [ファイル操作・管理]

 さて。
 続けてviの操作編。前アーティクルで、文字の追加と削除、ファイルの保存とエディタの終了について説明した。とりあえず、その操作だけでも出来ればがんばればどうにかなるのだが、正直なところちょっと大変過ぎるので(大笑)、もう少しだけ、viのコマンド・操作について覚えておいて欲しい。

 それでは、前アーティクルで作成した「lesson1.txt」で練習を再開することにしよう。コマンドプロンプトから、「vi lesson1.txt」でファイルを開こう。

 今度は前回と少しだけ表示が異なっていることが判る。
20100115_vi編集開始直後.jpg ←viコマンド開始直後の状態。ターミナルの一番下の行で、前回「New File」とい表示があった場所に、「1L, 7C」という表示が見える。これは、そのファイルの行数文字(キャラクター)数を示している。1行・7文字のファイルですよと言っているのである。

 「7文字?」画面上には「6文字」しか見えないけど?

 これは、画面上では見えないが、「ABCXYZ」のさらに後ろに、改行コードが入っている場合、その改行コードそのものもカウントされているからの他ならない。このように、文字(キャラクター)数は、人間の目に見える文字だけとは限らないことに留意してほしい。


・行の末尾に文字を追加する

 前アーティクルで、「a」コマンドを説明した。これはカーソルの後ろに文字を追加するコマンドであった。viでファイルを開いた直後、カーソルは先頭の「A」の上に表示される。この時点で「a」を押すと、カーソルの後ろに文字が追加されることになるので、「A」と「B」との間に文字が挿入されることはわかるだろうか。

 このような時に、「a」の代わりに、大文字アルファベットの「A」(Shiftキー+aキー)を押すと、カーソルがある行の末尾に文字が追加されるようになる。先ほどの、viコマンドでファイルを開いた直後の状態から、「A」を押すと…
20100115_viA.jpg ←このように、カーソルキーが「Z」の後ろに移動した上でターミナルの一番下の行に「-- INSERT --」と表示され、エディットモードになっていることがわかる。これで、行の末尾にどんどん追記することができるようになる。

20100115_viA追記.jpg ←こんな具合に。


 ちなみに、Enterキーを押すまでが「一行」なので、ターミナル内で折り返している行があっても、Enterキーが押された位置までカーソルは移動する。
 たとえば…
20100115_viじゅげむ1.jpg ←「すごく長い1行」の例。ファイルの中には、「じゅげむじゅげむ…」をローマ字で書いた行がある。ターミナル内では3行にわたっているが、Enterキーは3行目の末尾部分で1回押しただけ。カーソルは行の先頭(ターミナル内1行目の先頭)にある。
 この状態で「A」を押すと…

20100115_viじゅげむ2.jpg ←このように、「見た目の1行」でなく、長い行の末尾にカーソルが移動していることがわかる。


・行のコピーとペースト

 1行をまるまるコピー&ペーストすることができる。ちなみに、viの文化(?)では、コピーといわずに「ヤンク」と言うらしい。わりとどうでも良いことだけども。。。。

 まず、コピーしたい行にカーソルを移動させる。(といっても、今は1行しかないのだけども)カーソルのカラム位置はどこにあっても構わない。要するにカーソルが「その行」にいればよい。

 その状態でキーボードの「y」キーを2回、つまり「yy」とタイプする。この状態で、1行丸ごとバッファに保存(コピー)される。Windowsでいうところの「クリップボード」って奴。

 そして、キーボードの「p」キーまたは「P」キーを押すと、今コピーした行がペーストされる。小文字のpと大文字のPとでは、ペーストされる位置が異なる。小文字の「p」は、今カーソルのある行の下の行にペーストされ、大文字の「P」は、今カーソルのある行の上の行にペーストされる。
 前アーティクルで作成したファイルは1行しかないのでわかりづらいと思うので、下にサンプル画像を用意したので、こちらを見てもらいたい。
20100115_viペースト例1.jpg ←今、カーソルはアスタリスクが6個書かれている行の上にある。ちなみに、この行に移動する前に「ABCXYZ」の行で「yy」を実行し、バッファに保存した状態になっている。
 この状態で、アルファベット小文字の「p」を押すと…

20100115_viペースト例2.jpg ←このように、カーソルがいたアスタリスクの行の下の行にペーストされた。一方、先ほどの状態から、アルファベット大文字の「P」を押した場合は…

20100115_viペースト例3.jpg ←このように、カーソルがいたアスタリスクの行の上の行にペーストされた。
 このように、小文字と大文字とで動作が微妙に異なるので気をつけてもらいたい。


・行を丸ごと削除する

 こんどは、1行丸ごと削除するコマンド。「yy」と似ているが、キーボードの「d」キーを2回押す。つまり、「dd」と入力することになる。「yy」コマンドと同じように、カーソルが現在位置している行が削除される対象となり、カラム位置はどこにあっても構わない。
20100115_vidd前.jpg ←たとえば、3行のデータがあるファイルを想定したとして、今カーソルは真ん中の2行目、アスタリスクの行に位置している。ここで「dd」と入力すると、この行が消えるはず。

20100115_vidd後.jpg ←このように、アスタリスクの行が消えて、3行目だった行が2行目になっている。

なお、「dd」コマンドで削除した行も「yy」コマンドと同じくバッファに保存されるため、「p」または「P」でペーストすることが出来る。
 先ほどの例でアスタリスクの行を削除した状態で、カーソルが2行目「DEFUVW」の行にある。ここで「p」を押すとカーソルのある行の下、つまり「DEFUVW」の次の行に先ほど削除した行が表示されるのである。
20100115_vidd後p.jpg ←こんな具合。行の移動とか、間違って削除した行の復活とかに使えるのであった。


・文字・文字列の書き換え

 とりあえず、「x」と「i」または「a」さえ知っていればどうにかできる範疇のものではあるけども、これを知っているのと知らないのとでは便利さが結構違うのでついでに紹介しておく。

 カーソルが今いる位置の文字を1文字書き換えたい…というときには、キーボードの「r」を押す。すると、今カーソルがいる位置の文字を1個だけ書き換えることが出来る。1文字書き換えると自動的にコマンドモードに復帰する。

 たとえば、「ABCXYZ」の「X」を「D」に書き換えるとしよう。(結果的に「ABCDYZ」にしたい)
 カーソルを「X」の上に移動する。
20100115_viXの上.jpg ←この状態から、キーボードの「r」キーを押してから「D」を入力すると…

20100115_vir.jpg ←このように、「X」が「D」に置き換わる。

 なお、大文字の「R」を押すと、1文字だけでなく文字列の書き換えを行うことが出来る。たとえば、「ABCXYZ」を「ABCDEF」に書き換えたい場合、「X」の上にカーソルを移動したら、「R」を押し、続けて『DEF』と入力すると、XYZの部分を書き換えることができる。「R」で書き換えを行う場合は、「Esc」キーを押すまでずーっとエディットモードに入ったままになるので注意が必要。

・カーソルを移動する

 ぶっちゃけ、いまどきのLinuxな環境ならコマンドモードでもエディットモードでもカーソルキーを押せばカーソルを移動することができるので、あまり深く考える必要は無いのだが、ごくまれに、キーボードの設定が壊れたり消えたりしてカーソルキーが使えない…なんてこともありうる。そのような場合にも対応できるよう、コマンドモードでカーソル移動をする方法を覚えておこう。

 キーボードの「h」「」「k」「l」を使う。これらのキーはそれぞれ、「」「」「」「」に対応している。

 これ、苦手な人多いみたいね…(笑)

 なお、カーソルを大して移動しない場合なら、こうしたキーでちまちま移動しても構わないが、すごく大きなファイルで、ファイルの一番最後に移動したいとか、一番先頭に移動したいとか、「じゅげむじゅげむ…」ばりに長い行の先頭・末尾にカーソルを移動したいとかいうこともあると思う。このような場合には、それぞれ以下のようなコマンドを使うと良い。

 ファイルの先頭に移動する … 「:1
 ファイルの指定行に移動する … 「:行番号
 ファイルの最終行に移動する … 「:$
 その行の先頭に移動する … 「0
 その行の末尾に移動する … 「$

 指定行に移動するコマンドは、「:」(コロン)で始まるコマンドなので、Enterキーを押す必要があることは言うまでもない。

 他にも便利な機能は沢山あるのだけども、今回はひとまず、ここで紹介した機能さえ使えればどうにかなるので、ここで一旦終了したい。
 viについて興味がある人は、「オライリー・ジャパン」から出版されている解説書を読んでもらいたい。

いきなりの難問で申し訳ないが…~viエディタに慣れてもらおう!~ [ファイル操作・管理]

 さて。
 ログインしてパスワード変更をしてログアウトする手順についてみてもらった、UNIX/Linux管理者のタマゴな人たちに、いきなり「vi」の説明をしなければならないのが心苦しいのだが(笑)、コレが使えないとどうしようもないので、思い切っていきなり最初に練習してしまおうと思うので、覚悟していただきたい。(笑)

 「vi」とは、テキストエディタである。UNIXの時代から続く古式ゆかしいエディタである。まあ、今でこそ他にもっと便利なエディタが使えるようになっているものの、サーバ障害などでにっちもさっちもいかなくなってしまった場合などでviしか使えない!!…というケースに陥ることもゼロではないので、最後の頼みの綱として活躍することもある。そんなことになって初めて慣れない「vi」で四苦八苦するよりも、できれば日常的に、少なくともUNIX/Linuxサーバの上では使い続けることで、習熟しておいたほうが良いのではないかと思う。

 と、前置きが長くなってしまったが、それでは「viエディタ」の使用方法について、解説しつつ練習してもらうことにする。

 コマンドは「vi」である。このコマンドに続けて、作成したいファイル名・編集したいファイル名を指定する。
 たとえば、「lesson1.txt」というファイル(今はまだ無い)を新しく作成する場合は…

 vi lesson1.txt

 と、コマンドを実行することとなる。
 このコマンドを実行すると、ターミナルソフトの画面が全体的に書き換わる。たとえば↓みたいな感じ。
20100115_vi新規.jpg 画面全体がエディタになる。一番下の行は、ステータスが表示されたり、エディタコマンドを入力するための領域として使用されたりする。サンプルで表示している画像では、ウィンドウの一番下に
 "lesson1.txt"
とか、
 [New File]
とか、表示されているのがわかる。この場合は読んで字のごとく、lesson1.txtという新しいファイルを編集(作成)してますよ…ということを意味しているのである。

 さて。Windowsに標準で添付されている「メモ帳」とか、利用者の多いことで名高い「秀丸エディタ」、私が個人的にイチオシする「TeraPad」などのような、GUI環境で動作するテキストエディタと決定的に異なるのが、「vi」には「モード」という概念が存在する。この、「モード」には大きく分けて
 1.コマンドモード
 2.エディットモード
の2つがあって、コマンドモードでは押したキーに応じてカーソルが移動したり、文字や行をコピーしたり削除したりペーストしたり、ファイルを保存したり文字の置換をしたり…といった振る舞いをする。一方エディットモードでは押したキーがそのままテキストデータとしてファイルの書き込まれることとなる。キー操作によってコマンドモードエディットモードとを切り替えながら使うのが、この「vi」の特徴であるといっても良いかもしれない。

 で、先ほど見てもらったviの画面では、エディタはコマンドモードになっている。このまま入力したい文字のキーを押したところで、文字は入力されない

 まずは簡単なところから紹介しよう。コマンドモードからエディットモードへモードを切り替えるコマンドから。

 コマンドモードで、キーボードの「i」を押す。すると、エディットモードに切り替わる。

20100115_vi挿入.jpg 先ほどまで、ファイル名が表示されていたターミナルの一番下の行が、「-- INSERT --」という表示になった。今
エディタのモードはエディットモードになっていることがこれで判る。今から押したキーはコマンドとして解釈されず、ファイルの中身として画面上に表示されるようになる。

 ためしに、「ABCXYZ」とでも入力してみようか。
20100115_vi挿入ABCXYZ.jpg このように、今度は入力したキーがそのまま画面に表示された。先ほどコマンドモードの時に入力した「i」は画面に表示されなかったことと比較してほしい。
 キーを入力し誤った場合などはBackSpaceキーで遠慮なく修正してもらいたい。なお、そのサーバ管理者が特に古風なその筋の人の場合、BackSpaceキーのかわりにDeleteキーを使うように設定されていることもあるので、そのあたりは驚かないように。サーバ管理者から説明があるかもしれないので、その場合はサーバ管理者の指示に従ってもらいたい。


 こんどは、エディットモードからコマンドモードに切り替える方法を説明する。こっちは非常に簡単で、単にキーボードの「Esc」キーを1回押せばよい。すると、ターミナルの一番下の行に表示されていた「-- INSERT --」の表示が消えることが判る。これでコマンドモードに戻ったのである。
 なお、この「Esc」キーをしてコマンドモードに戻る方法は、エディットモードからの復帰だけでなく、コマンドモードで何らかの長めのコマンドを入力している時にその入力をやめる際とかにも使える。「Esc」キーを押せば必ずコマンドモードになるので、操作中に訳がわからなくなったケース等では「Esc」キーをバシバシ叩いておけば、とりあえずコマンドモードに戻れるということを覚えておいてほしい。

 ちなみに、コマンドモードからエディットモードへモードを切り替えるコマンドとしてはキーボードの「a」を押す方法もある。キーボードの「a」キーを押してもキーボードの「i」キーを押したときと同様に、エディットモードになってターミナルの一番下の行に「-- INSERT --」という表示が出る。しかし両者には微妙な違いがあるので気をつけてほしい。

 例として、今入力した「ABCXYZ」という文字列の、「ABC」と「XYZ」との間に『DEF...UVW』という文字を挿入してみようと思う。
 コマンドモードになっている状態で、キーボードの「h」キー、またはカーソルキーの「←」キーを押して、カーソルを「x」の文字の上に移動する。
20100115_viXの上.jpg ←こんな感じになったら、ここでさきほど使ったキーボードの「i」キーでエディットモードにモードを切り替える。

20100115_viXの上でi.jpg ←こうしてエディットモードに切り替えるが、この状態でそのまま『DEF...UVW』と入力する。

20100115_viXの上でi2.jpg ←するとこのように文字が追加されるのである。

 では、「微妙に動作が異なる」という、キーボードの「a」キーだとどうなるか。
 さきほどと同じように、ABCXYZという文字列が表示されている状態でカーソルを「x」の上に移動したところから、キーボードの「a」キーを押してエディットモードに切り替えてそのまま『DEF...UVW』と入力すると…
20100115_viXの上でi3.jpg ←と、このようにDEF...が入力される位置が違うことが判る。


 つまり、
  i…カーソルのに挿入
  a…カーソルの後ろに挿入(というか追加…append)
 ということだと理解してもらうとよいだろう。

 文字の追加に続いて、文字の削除も押さえておこう。
 文字を削除するための一番基本的なコマンドは、コマンドモードで、キーボードの「x」キーを押す。1回押すと、今カーソルがある位置の文字が1文字削除される。
 先ほど、「ABCDEF...UVWXYZ」とした文字列を、再び「ABCXYZ」に戻してみよう。

 コマンドモードでカーソルを「D」の上に移動してから、キーボードの「x」キーを9回押すと…(面倒くさいのでスクリーンショットは省略)

 めでたく「ABCXYZ」に戻っていることだろう。

 ということで、文字の追加と文字の削除とが出来れば、必要最低限のことはどうにかなるので、しっかり覚えておいてほしい。

 で、アーティクルがずいぶんと長くなってしまったが、あとどうしても覚えておいて欲しいことが残っているので、それも一緒に説明する。

 viコマンドを終了させる方法だ。

 ファイルの編集が出来るようになっても、エディタが終了できなければ意味が無い。(笑)その方法を説明する。
操作は全てコマンドモードで行う。キーボードの「:」(コロン)キーを押すところからはじまる。
20100115_viXの上.jpg ←たとえば、この状態から「:」(コロン)キーを押すと…

20100115_viコロンキー.jpg ←このように、ターミナル画面の一番下の行に「:」とカーソルが表示されるようになる。この状態になったところで、エディタを終了するためのコマンドを入力するのである。

 ファイルをそのまま保存する場合(Windowsでいうところの「上書き保存」) … 「:w」 (まだviは終了しない)
 別の名前をつけて保存する場合(Windowsでいうところの「名前をつけて保存」) … 「:w File名」 (まだviは終了しない)

 ファイルをそのまま保存して終了する場合(「上書き保存」してから「終了」を同時に) … 「:wq

 ファイルを保存しないで終了する場合 … 「:q
  ※なお、開いたファイルを編集しているにもかかわらず、保存しないまま終了しようとするとエラーになるので、↓のコマンドを実行する必要がある

 編集済みのファイルを保存しないで終了する場合 … 「:q!
  ※強制的に終了するが、Windowsみたいに「本当によいですか?」みたいな確認はしてこないので要注意。

 なお、「:」(コロン)で始まるコマンドは、Enterキーを押して有効になる。モードを切り替える際のコマンドはワンキーで直ちに切り替わったことと比べて欲しい。「:」(コロン)で始まるコマンドをキャンセルしたい場合も、「Esc」キーを押せばコマンドモードに復帰するようになっている。

 それでは、今作成したファイル「lesson1.txt」には「ABCXYZ」と記述されている状態で保存し終了してもらいたい。コマンドは「:wq」と入力してからEnterキーを押す。すると、Linuxのコマンドプロンプトが表示される、viが終了したことがわかる。

※※まとめ※※
 ・viはテキストエディタである。
 ・viには、「コマンドモード」と「エディットモード」とがある。
 ・コマンドモードで「i」キーを押すと、「コマンドモード」から「エディットモード」に切り替わり、カーソルの前に文字が挿入される。
 ・コマンドモードで「a」キーを押すと、「コマンドモード」から「エディットモード」に切り替わり、カーソルの後ろに文字が挿入される。
 ・コマンドモードで「x」キーを押すと、カーソルがある位置の文字が1文字消える。
 ・エディットモードで「Esc」キーを押すと、コマンドモードに切り替わる。
 ・コマンドモードで「:」(コロン)に続けて「w」「wq」「q」「q!」と入力するとファイルを保存したり、viを終了したりすることができる。

ファイル操作・管理 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。