Daily ASCII Linux

All ASCII Linux Issue / Linux Magazine 2000年5月号

覚えておきたい必須コマンド30―その2・便利なコマンド

知っているとオペレーションが100倍便利になる各種のコマンドを覚えよう


2001年6月9日

入出力の切替え

Linux magazine logo


Linux magazine 5月号表紙
本記事も収録 Linux magazine 2000年 5月号 1,390円

ディレクトリ内容を表示するのにlsコマンドを利用した。


USER$ ls /

lsコマンドを次のようにして使うと、その出力が端末でなく、sample.txtファイルに出力される。これをリダイレクトと呼ぶ。


USER$ ls / > sample.txt

>の代わりに>>を使うと、出力した内容が指定されたファイルの末尾に追加される。


USER$ ls /bin >> sample.txt

lsコマンドは通常、結果を端末(画面)に出力する。この端末は標準出力と呼ばれる。>と>>は表示先を標準出力から、ファイルへと切替えるための記号だ。この記号はlsが提供する機能ではなく、シェルの機能なので、標準出力に対して結果を書き出すすべてのコマンドに対して利用できる。

標準出力に対応して標準入力も用意されている。

catコマンドは、指定されたファイルの内容を標準出力に表示するコマンドであるが、入力ファイルを指定しないと、キーボードを入力とする。このキーボードが標準入力だ。標準入力からの入力を終了するには、行頭でCtrl-D(コントロールキーを押しながらDキー)を入力する。


USER$ cat
hoge    キーボードから入力した文字
hoge    catコマンドの出力
fuga    キーボードから入力した文字
fuga    catコマンドの出力
        Ctrl-D
USER$

<を使うと、標準入力をファイルに切替えることができる。


USER$ cat < sample.txt

また、┃を使うと、コマンドの出力を標準入力として、別のコマンドに渡すことができる。この機能をパイプと呼んでいる。

次の例では、lsで表示した結果を、sortコマンドで並べかえている。


USER$ ls -aF1 | sort
../
./
.Xdefaults
.bash_history
.bash_profile
.bashrc
.emacs
   :
   :

Linuxで提供されているコマンドを個別に見ると、それぞれは単純な動作しかしないものが多い。しかし、パイプや入出力の切替えをうまく使うと、複雑な処理であっても、簡単に実現できる。これもコマンドによるオペレーションの魅力だろう。


USER$ ls -aF1 | sort > sorted.lst


(中野 賢)


ファイルの内容を表示する

ファイルの内容を出力するコマンドはいくつもあるが、catコマンドがもっとも基本的なコマンドだ。

catコマンドは指定されたファイルの内容を標準出力に書き出す。複数のファイルを指定すると、それらをまとめて出力する。


USER$ cat a.txt b.txt c.txt > all.txt

のように、ファイルを連結するのに便利だ。

nオプションを付けると、各行に番号が付いて出力される。


USER$ cat -n smaple.doc

ファイルの内容が1画面に収まらないときはlessコマンドが便利だ。端末の画面サイズに応じて表示が止まる。よく使うキー操作を表2に示す。

表2 lessのキー操作
キー 実行内容
スペースバー 1画面下方向にスクロール
b 1画面上方向にスクロール
j 1行下方向にスクロール
k 1行上方向にスクロール
p ファイルの先頭へ移動
G ファイルの末尾へ移動
h 使い方の説明
q 終了


USER$ less /etc/services

ログファイルなどは、ファイルの末尾のほうに最近の 情報が格納されている。このときはtailコマンドが便利だ。デフォルトでは末尾の10行分だけを表示する。行数を変更するには、その数値をオプションで指定する。


root# tail -20 /var/log/messages

画面出力も見ながら、結果をファイルに残したいときはteeコマンドが便利である。teeは標準入力を指定されたファイルと標準出力に書き出す。


USER$ vmstat 5 10 | tee /tmp/vmstat
.log

(中野 賢)


オンラインマニュアル

コマンドオプションは、プログラムの動作を変更するために設けられている。そのため、プログラムの役割が異なれば、使えるオプションも異なるし、同じオプション名であっても動作が異なる。たとえば、rmやmvではfは強制的に動作させるためのオプションだが、tarのfオプションはアーカイブファイル名を指定するのに用いる。さらに、オプションの指定方法もコマンドごとに異なる。aとbオプションを指定するとき、-abとできるコマンドもあれば、-a -bと個々に指定するしかないのもある。

使い方のわからないコマンドは、manコマンドで簡単に調べることができる。使い方は、次のように、引数にコマンド名を指定するだけだ。


USER$ man man

kオプションでキーワードを指定すると、関連するページが表示される(画面3)。


USER$ man -k passwd
chpasswd (8)    - update password file in batch
gpasswd (1)     - administer the /etc/group file
htpasswd (1)    - Create and update user authentication files
mkpasswd (1)    - generate new password, optionally apply it to a user
mkpasswd (8)    - Update passwd and group database files
passwd (1)      - update a user's authentication tokens(s)
passwd (5)      - password file
pg_passwd (1)   - Manipulate the flat password file
userpasswd (1)  - A graphical tool to allow users to change their passwords.
yppasswd, ypchfn, ypchsh (1)    - change your password in the NIS database
画面3 manで“passwd”に関連するページを検索

かっこ内の数値はセクション名であり、次の分類を示している。

  • 1 一般的なコマンド
  • 2 システムコール
  • 3 ライブラリ関数
  • 4 スペシャルファイル
  • 5 ファイルフォーマット
  • 6 ゲーム
  • 7 その他
  • 8 管理コマンド
  • l ローカルなコマンド
  • n 新しいコマンド

同じ名前のページが複数のセクションにある場合は、セクション番号を指定して、目的のページを表示する。たとえば、passwdコマンドではなく、パスワードファイル/etc/passwdの詳細について調べたい場合は、セクション5にあるpasswdを表示するよう指定する。


USER$ man 5 passwd

オンラインマニュアルには、もうひとつinfoコマンドも用意されている。


USER$ info info

とすると、infoコマンドのチュートリアルが表示されるので試してみてほしい。

コマンドオプションを調べたいとき、manやinfoでも見つからなければ、--helpや-hを付けて実行してみよう。オプションの説明が表示されることがある。

(中野 賢)


ファイルの種類

ディレクトリツリー上には、さまざまな種類のファイルが置かれている。そのため、バイナリファイルと気づかずにcatして画面が乱れてしまうこともある。事前にどのようなファイルなのかがわかると便利だ。

fileコマンドは指定されたファイルの種類を表示してくれる(画面4)。



USER$ file /usr/bin/*
/usr/bin/GnomeScott:    ELF 32-bit LSB executable, Intel 80386, version 1,
dynamically linked (uses shared libs), stripped
/usr/bin/Mail:          symbolic link to ../../bin/mail
/usr/bin/Pnews:         Bourne shell script text
/usr/bin/Rnmail:        Bourne shell script text
/usr/bin/SwitchXIM:     Bourne shell script text
/usr/bin/X11:           symbolic link to ../X11R6/bin
/usr/bin/[:             symbolic link to test
/usr/bin/a2p:           ELF 32-bit LSB executable, Intel 80386, version 1,
dynamically linked (uses shared libs), stripped
/usr/bin/access:        ELF 32-bit LSB executable, Intel 80386, version 1,
dynamically linked (uses shared libs), stripped
/usr/bin/aclocal:       perl

commands text
                            :
                            :
画面4 fileコマンドの実行例

ただし、バイナリ形式に対してはかなり信頼できる報告をしてくれるが、テキストファイルに対しては間違いが多い。これは、fileコマンドがファイル形式を決定するのに、ファイルの先頭付近が特定のパターンになっているかどうかを調べているからである。そのため、テキストファイルのように決定的なパターンが見つからないと、うまく判断ができないのである。しかしながら、画面が乱れる恐れのあるファイルかどうかを調べるには十分だ。

なお、ファイル形式を決めるためのパターンは、/usr/share/magicファイルに記述されている。

(中野 賢)


漢字コードと改行コードの変換

テキストファイルに使われる漢字コードは、現在、EUC、シフトJIS、JISコードが代表的だ。ネットワークなどによって、異機種間でのファイルのやりとりが多くなると、すべてのファイルの漢字コードを統一するのは難しい。

lessやjvim、muleなどは、使われている漢字コードを自動的に認識し、変換して表示してくれる。しかし、すべてのプログラムがそうなっているわけではない。特に、sedやAWK、Perlなどでフィルタ処理するときには、漢字コードの違いによって、処理結果が異なってくるので注意が必要だ。

漢字コードの変換プログラムには、いくつかあるが、nkfコマンドがよく使われる。nkfが便利なのは、入力ファイルの漢字コードを自動認識してくれることだ。出力コードは、EUC(e)、シフトJIS(s)、JIS(j)を指定できる(かっこ内は指定するときのオプション)。たとえば、


USER$ nkf -e infile

とするとinfileの内容をEUCコードに変換して標準出力に出力する(画面に表示する)。

nkfは漢字コードは変換してくれるけれど、改行コードは変換してくれない。改行コードを変換する方法もいろいろあるが、今回はtrを使ってみよう。


USER$ nkf -s infile | tr \\n \\r

とすれば、UNIXの改行コード(\n)をMacintoshの改行コード(\r)に変換する。MS-DOSの改行コード(\r\n)に変換するには、


USER$ nkf -e infile | tr \\n \\r\\n

のようにする。バックスラッシュを重ねているのは、シェルに特殊文字だと解釈されないようにするためである。次のように引用符で囲んでもよい。


USER$ nkf -e infile | tr '\n' '\r\n'

なお、trコマンドの入力は標準入力だけである。したがって、nkfやcatを用いて、trにデータを渡すか、リダイレクトする必要がある。

Column コマンドラインでの一括処理

変換するファイルがいくつもあるときは、シェルの機能を使って、一気に変換すると便利だ。たとえば、bashの場合は、次のようにする。>のプロンプトはfor文の続きを入力するためのプロンプトである。


USER$ mkdir sjis
USER$ for f in *.doc ; do
> nkf -s $f > sjis/$f
> done

もし、カレントディレクトリにa.doc、b.doc、c.docというファイルがあれば、


nkf -s a.doc > sjis/a.doc
nkf -s b.doc > sjis/b.doc
nkf -s b.doc > sjis/c.doc

をしたことと同じになる。


(中野 賢)


文字列の検索

ファイルの数が多くなると、ファイル名だけでは、どこに何があったのかわからなくなってくる。あるキーワードが含まれるファイルを探したいときに、エディタの検索機能を用いるのも不便だ。grepコマンドはファイルから、指定したキーワードを探してくれる。

たとえば、linux.txtから“linux”という文字列を探すには、次のようにする。


USER$ grep linux linux.txt

キーワードの大文字/小文字を区別しないで探すのならiオプションを付ける。nオプションは一致した行の番号を表示する。


USER$ grep -in linux linux.txt
4: % ねらいとしては、Linux(UNIX)を
8: % 操作を通して、Linuxを理解してもらう
32: Linuxシステムは図1のような木構造
123: $ mkdir linux

キーワードの指定には正規表現も指定できる。正規表現とは、文字列のパターンを指定する記述法のことだ。表3によく使われる正規表現を示す。egrepではより強力な正規表現を使える。

表3 grepとegrepの正規表現
正規表現 意味
^ 行の先頭
$ 行の終り
. 任意の1文字
[...] ...のうちの 任 意の1文字。a-zや0-9のような範囲指定も有効
[^...] ...にない任意の1文字。範囲指定も有効
r* ゼロ回以上の、rの繰り返し
r+ 1回以上のrの繰り返し
r? ゼロまたは1回のr
r{n,m} n回以上m回以下のrの繰り返し
r1|r2r 1またはr2(egrepのみ)
(r) rの正規表現(egrepのみ)

正規表現を用いると、空行を探すことも簡単にできる。


USER$ grep -n '^$' linux.txt
10:
28:
44:

また、次のようにして、行頭がUSERまたはrootで始まる文字列を検索することも簡単だ。かっこや┃の表記はegrepでしか使えない。


USER$ egrep -n '^(USER|root)' linux.txt
14:USER$
20:USER$ pwd
80:USER$ cd /usr
160:root rootユーザーのホームディレクトリ

fgrepを用いると、複数個のキーワードを記述したファイルに基づいて検索することができる。


USER$ cat key
hoge
fuga
USER$ fgrep -ni -f key linux.doc

この場合は、keyファイルに記述されている“hoge”と“fuga”という文字列の含まれる行を表示する。

Column バーチャルCD-ROM

CD-ROMのバックアップを取りたい場合、catコマンドの引数にデバイスファイルを指定すると、そのデータを読み込み、標準出力に出力する。そこで、次のようにするだけで、簡単にCD-ROMの内容を取り出すことができる。


USER$ cat /dev/scd0 > /home/data
/foo|.img

作成したファイルは、ループバックデバイスを経由して、ファイルシステムにマウントできる。


root# mount -t iso9660 -o loop /home/data/foo.img /mnt/cdrom


(中野 賢)


ファイルの検索

ファイルが多くなってくると、どこに何のファイルを置いたか忘れてしまうことがある。また、エディタが作ったバックアップファイルだけを削除したいというようなこともある。findコマンドは、ディレクトリツリーの中から指定された条件に合うファイルを見つけてくれる。さらに、そのファイルに対して操作をすることもできる。

拡張子が.bakの名前を持つファイルを探したいときは、次のようにする。最初の引数のドットは検索をするディレクトリ位置である。この場合は、カレントディレクトリ以下を探すよう指定している。-nameはファイル名で探すという指示であり、名前の条件は「*.bak」に一致するファイルとしている。ファイル名を引用符で囲んでいるのは、アスタリスクをシェルに解釈されないようにするためだ。


USER$ find . -name '*.bak'
./2000-05/linux.txt.bak
./2000-05/lists.txt.bak

execオプションを用いると、探し出した各ファイルに対して、削除やパーミッションを変更したりといった操作をすることができる。たとえば、バックアップファイルを削除するには、次のように指定する。execオプションはセミコロン(;)までの間をコマンドとして実行する。セミコロンにバックスラッシュを付けているのも、シェルに解釈されないためである。


USER$ find . -name '*.bak' -exec rm -f {} \;

{}の部分が見つかったファイルの名前に置換される。上記の例は、次のように実行されることに等しい。


rm -f ./2000-05/linux.txt.bak
rm -f ./2000-05/lists.txt.bak

ディレクトリ単位でファイルのパーミッションを変更するようなとき、chmodのRオプションでは、ファイルもサブディレクトリもすべて変更してしまう。しかし、設定するパーミッションによっては、ディレクトリのパーミッションは変更したくない場合がある。このようなときにもexecオプションは便利だ。

次の例では、ファイルのパーミッションを644、ディレクトリを755にしている。


USER$ find . -type f -exec chmod 644 {} \;
USER$ find . -type d -exec chmod 755 {} \;

findは時刻をもとに検索することもできる(画面5)。


USER$ date
Wed Mar 22 15:07:46 JST 2000
USER$ ls -ltr
合計 228
-rw-r--r--   1 ken-na   staffs       2909 Mar 13 15:27 from-kinoshita.txt
-rw-r--r--   1 ken-na   staffs       1958 Mar 14 20:15 options.txt
-rw-r--r--   1 ken-na   staffs       2643 Mar 15 17:42 lists.txt
-rw-r--r--   1 ken-na   staffs       2643 Mar 15 17:42 lists.txt.bak
-rw-r--r--
  
1 ken-na   staffs      58572 Mar 22 15:11 genko.txt
-rw-r--r--   1 ken-na   staffs      58655 Mar 22 15:11 genko.txt.bak
USER$ find . -mtime +6
./from-kinoshita.txt
./options.txt
USER$ find . -mtime -6
.
./genko.txt
./genko.txt.swp
./genko.txt.bak
USER$ find . -mtime 6
./lists.txt
./lists.txt.bak
USER$ find . -mmin -10
.
./genko.txt
./genko.txt.bak
USER$ find . -newer options.txt
.
./genko.txt
./genko.txt.bak
./lists.txt
./lists.txt.bak
画面5 findの実行例

mtimeオプションはファイルが最後に修正された時刻で検索する。オプションのうしろの数値は日数を示している。日数の前にプラスを付けると、最後に修正された時刻がその日数よりも前のファイルが報告される。マイナスの場合は指定した日数が経っていないファイルが報告される。何もつけないとその日数分だけ経過したファイルになる。

mminオプションもmtimeと同様だが、指定する数値の意味が分単位になる点だけが違う。

newerオプションは数値でなく、ファイルを指定する。そして、指定されたファイルが最後に修正された時刻よりも、最近修正されたファイルが報告される。

mtime/mmin/newerはファイルが最後に修正された時刻をもとにしたが、同様のものとして、最後にアクセスされた時刻をもとにするatime/amin/anewer、最後に属性が変更された時刻をもとにするctime/cmin/cnewerもある。

(中野 賢)


ファイルの圧縮と展開

ソースファイルや文書ファイルを配布するときに、バラバラに渡すと必要なファイルがなかったりして混乱しやすい。そこで複数のファイルをまとめることになる。この用途のためのプログラムはアーカイバとか書庫プログラムと呼ばれる。アーカイバにもいろいろあるが、Linuxではtarがよく使われている。

アーカイブファイルを作成するには、作成を指示するためのcオプションと、出力ファイルを指定するためのfオプションを指定する。そして、含めるファイルを指定する。


USER$ tar cf ciao.tar ciao.c ciao.1 Makefile

ディレクトリを指定した場合は、ディレクトリ情報も保存される。


USER$ tar cf hoge.tar ciao

作成されたtarファイルの内容を確認するには、cの代わりにtオプションを使う。


USER$ tar tf ciao.tar
ciao/.exrc
ciao/Makefile
ciao/ciao.c
ciao/ciao.1

tarファイルを展開するには、xオプションを指定する。ディレクトリ付きで作成されているtarファイルの場合は、そのディレクトリもあわせて復元される。


USER$ tar xf ciao.tar
USER$ ls -a ciao
.    .exrc      ciao.c
..   Makefile   ciao.1

 パス名を含めてtarファイルを作成するときは、少し注意が必要だ。絶対パスで保存をしてしまうと、パーミッションの関係から、スーパーユーザーでないと展開できなくなる可能性があるからだ。GNU版ではPオプションを付けない限りは、先頭の/を取り除いてtarファイルを作成するようになっている。だが、他のOSが提供しているtarコマンドもそうだとは限らない。間違いを減らすためにも、つねに相対パスで指定するクセを付けるほうがよいだろう。

tarコマンドは、ファイルをまとめるだけで圧縮はしない。そのため、ファイルの大きさを小さくするには、別に圧縮をする必要がある。以前は圧縮形式として、compress形式が使われていたが、最近はより圧縮率の高いgzip形式が使わることが多い。

tarファイルを圧縮するには、次のようにする。


USER$ gzip ciao.tar

すると、カレントディレクトリにciao.tar.gzが作成される。tarでまとめたものをパイプでgzipコマンドに渡すこともできる。tarコマンドのーは標準出力を示している。gzipコマンドのーcも標準出力へ出力するオプションである。


USER$ tar cf - ciao | gzip -c > ciao.tar.gz

逆に、tar+gzipで作られたアーカイブのリスト一覧を見るときや展開するときも同様に行える。gzipのdオプションは、展開をするためのオプションだ。


USER$ gzip -cd ciao.tar.gz | tar tf -

GNU版のtarでは、tarコマンドのzオプションで同様のことができる。


USER$ tar zcf ciao.tar.gz ciao
USER$ tar ztf ciao.tar.gz
USER$ tar zxf ciao.tar.gz

tarコマンドは、ファイルシステムを越えて、ディレクトリを移動するときにも便利だ。次の例の後半は、ディレクトリを移動して、そこで標準入力から受け取った内容を展開している。後半部分をかっこで括らないと正しく動作しないことに気をつけてほしい。


USER$ tar cf - hoge  | (cd /export/share/fuga ; tar xf - )

また、rshコマンドを利用できれば、ネットワークを越えてファイルコピーするのにも使える。


USER$ tar cf - hoge | dd bs=1024 | rsh リモートホスト名 dd bs=1024 of=hoge.tar.gz

2番目のddコマンドは出力するブロックサイズを指定するためだけに用いている。そして、リモートホストのddでは、ofオプションでhoge.tar.gzに書き出している。ofの指定をテープデバイスに指定すれば、ローカルホストに接続されていないデバイスにバックアップすることができる。

(中野 賢)




[通常ページに戻る]
ASCII24 http://ascii24.com/
Copyright (C)1999-2006 ASCII Corporation. All rights reserved.