ものづくりのためのLinux講座【基本コマンド】

スポンサーリンク
LinuxClass BasicCommand

本記事は「ものづくりのためのLinux講座」のうちの基本コマンドに関する内容です。

よく使うコマンドや機能を短期間で使いこなせるようになることを目指した内容になっています。

そのため、あらゆる機能を網羅することは重視していません。

ls

ファイル、ディレクトリの一覧を表示するコマンドで、最も使用頻度の高いコマンドです。

以下のように引数無しで実行すると、現在いるディレクトリ(カレントディレクトリ)のファイルを表示します。

現在いるディレクトリのことをカレントディレクトリと呼びます。

以降、カレントディレクトリと表現します。

ls

以下のようにディレクトリやファイルを指定して実行することもできます。

ls ディレクトリ(またはファイル)

ディレクトリやファイルはパスと呼ばれる形式で表現します。

パスは、/home/userなどのようにスラッシュ区切りでファイルやディレクトリの場所を表すものです。

スラッシュから始まるパスを絶対パスと呼び、dir1/file1.txtのようにスラッシュから始まらないパスを相対パスを呼びます。

相対パスはカレントディレクトリにあるファイル・ディレクトリを始点にパスを記述します。

主なオプションとして以下があります。

オプション説明
-l詳しい情報を表示
-a.(ドット)から始まる隠しファイルも表示
-11列で表示
-tタイムスタンプが新しい順に表示
-r逆順で表示

他にもたくさんオプションがあるので、気になる方は次のmanコマンドを使って調べてみてください。

man

コマンドのマニュアルを参照します。

man コマンド名

どんなオプションがあるのかを調べたい場合などに重宝します。

コマンドの使用例などはあまり充実していないので、”linux コマンド名 使用例”などのキーワードでググった方が良いと思います。

cd

ディレクトリを移動するコマンドです。

ディレクトリは、Windowsでのフォルダのことです。

cd ディレクトリ

以下をディレクトリとして指定した場合、特殊な意味があります。

ディレクトリ意味
..1つ上のディレクトリ
.カレントディレクトリ(現在いるディレクトリ)
~ホームディレクトリ
~ユーザ名ユーザ名のホームディレクトリ
ここに移動する前にいたディレクトリ

pwd

カレントディレクトリのパスを表示するコマンドです。

pwd

ターミナル操作を行う場合、今どのディレクトリにいるのかは重要な要素になるので、現在位置を確認する際に使用します。

mkdir

ディレクトリを新たに作成するコマンドです。

mkdir ディレクトリ

主なオプションとして以下があります。

オプション説明
-pパスの途中に存在しないディレクトリがあった場合にそのディレクトリを作成する

rmdir

ディレクトリを削除するコマンドです。

rmdir ディレクトリ

ディレクトリが空(配下にファイルもディレクトリも存在しない)でないと削除できません。

空ではないディレクトリを配下のファイルごと削除する方法は以降のrmの章を参考にしてください。

cp

ファイルやディレクトリをコピーします。

WindowsやMacではファイルのコピーはExplorerやFinderを使って行うことが多いと思いますが、Linuxではターミナル操作を行う頻度が高いので、cpコマンドを使うことの方が多くなると思います。

cp コピーしたいファイル コピー先

コピー先が存在しないファイル名の場合、そのファイルにコピーします。

コピー先がすでに存在するディレクトリの場合、そのディレクトリに同名ファイルでコピーします。

主なオプションとして以下があります。

オプション説明
-rディレクトリごとコピーする
-pumaskを無視してコピー元の属性を維持する

ディレクトリとその配下のファイル・ディレクトリもコピーしたい場合は以下のように-rオプションを使用します。

cp -r コピーしたいディレクトリ コピー先

-pオプションを使うとumaskを無視してコピー元の属性を維持します。

cp -pr コピーしたいディレクトリ コピー先

mv

ファイル、ディレクトリを移動します。

mv 第1引数 第2引数

第1引数に移動したいファイルまたはディレクトリを指定し、第2引数に移動先となるファイル、またはディレクトリを指定します。

第2引数に存在するディレクトリを指定した場合、そのディレクトリ以下に移動します。

第2引数に存在しないファイル名、またはディレクトリ名を指定した場合、第1引数のファイルやディレクトリを第2引数に指定した名前に変更して移動します。

このように、mvはファイル、ディレクトリの移動だけでなく、ファイル名、ディレクトリ名の変更も行えます。

rm

ファイル・ディレクトリを削除します。

rm ファイルパス

主なオプションとして以下があります。

オプション説明
-rディレクトリごとコピーする
-f確認無しで削除する

ディレクトリごと削除する場合は以下のように実行します。

rm -rf ディレクトリパス

cat

ファイルの中身を表示します。

サイズの小さいテキストファイルの中身を確認する際によく使います。

サイズが大きくなってくると、ザーっと流れてしまうcatでは確認しづらいため、以降のmore, lessなどを使うと良いです。

cat 入力ファイル

more

catと同様にファイルの中身を表示しますが、ターミナルの1画面毎にスペースキー入力待ちになるので、サイズの大きなファイルの中身を順に確認したい場合に便利です。

more 入力ファイル

各キーと機能の割り当ては以下です。

キー機能
Space1画面送る
b1画面戻る
Enter1行送る
q終了する

less

lesscatmoreと同様にファイルの中身を表示しますが、よりviエディタに近い機能になっています。

less 入力ファイル

各キーと機能の割り当ては以下です。

キー機能
Space1画面送る
b1画面戻る
Enter, j, ↓1行送る
k, ↑1行戻る
d半画面送る
u半画面戻る
g先頭行に移動する
Gファイル末尾に移動する
数値g, 数値G数値の行番号に移動する
q終了する

ln

リンク(Windowsのショートカットのようなもの)を作成します。

基本的に-sオプション付きのシンボリックリンクのみ使うことで良いと思います。

ln -s リンクしたいファイル(またはディレクトリ) リンク名

リンク名を空にするとカレントディレクトリにリンク元ファイル(またはディレクトリ)と同名のリンクを作成します。

wc

ファイルの行数、単語数、文字数をカウントします。

wc ファイル名

uniq

ファイル内の連続する同一内容の行を1行にして出力します。

uniq 入力ファイル

例えば中身が以下の内容のファイルがtest1.txtだった場合に、

abc
abc
123
ABC

下記のコマンドを実行すると、

uniq test1.txt

出力結果は以下のようになります。

abc
123
ABC

sort

ファイルの中身をアルファベット順(ASCIIコード順)に並び替えて出力します。

下の方に並び替え対象のカラム指定の方法を紹介していますが、こういった処理をコマンドで実施できる環境が整っているのがLinuxの大きな特徴と言えます。

sort 入力ファイル

例えば中身が以下の内容のファイルがtest1.txtだった場合に、

abc
abc
123
ABC

下記のコマンドを実行すると、

sort test1.txt

出力結果は以下のようになります。

123
ABC
abc
abc

主なオプションとして以下があります。

オプション説明
-r逆順で並べる
-uソート後、重複行を1行にする(uniqをかける)
-kキー指定キー指定には並び替えの基準となる列番号を指定する
(カンマ区切りで複数列を指定可、先に指定したものが優先)
-t区切り文字-kで区切りとして認識する文字を指定する

キー指定のソートの例を示すために、以下の内容のファイルがtest2.txtだったとして、

111 aaa ZZZ
222 ccc  XXX
33  bbb   YYYYY

下記のように3列目をキーにした並び替えを実行すると、

sort -k3 test2.txt

出力結果は以下のようになります。

222 ccc  XXX
33  bbb   YYYYY
111 aaa ZZZ

3列目のZZZ, XXX, YYYYYがアルフェベット順になる並びになりました。

区切り文字を指定しない場合、空白やタブの1つ以上の連続を列の区切りとします。(例:空白が複数連続しても1つの区切りとして扱われます)

区切り文字指定はCSV形式(カンマ区切り)のファイルの中身をソートする場合などに便利です。

例えば以下の内容のCSVファイルがtest2.csvだったとして、

111,aaa,ZZZ
222,ccc,XXX
33,bbb,YYYYY

下記のように-tオプションでカンマを区切り文字に指定して実行すると、

sort -t, -k3 test2.csv

出力結果は以下のようになります。

222,ccc,XXX
33,bbb,YYYYY
111,aaa,ZZZ

diff

2つのファイルの差分を出力します。

これもよく使うコマンドです。

Windowsのテキストエディタなどでも2つのファイルの差分を確認する機能があるものもあると思いますが、メニューを開いてファイルを指定して…というようにGUIで何度かマウスクリックが必要になると思います。

これをコマンド一発でできるLinux環境はとても便利です。

これに慣れてしまうともうGUIに戻りたくないと思うハズ、そうなったらあなたもターミナルの住人ですね。

diff ファイル1 ファイル2

主なオプションとして以下があります。

オプション説明
-b空白の個数の違いを無視する
-wすべての空白を無視する
-B空の行を無視する

以下の左がtest3.txt、右がtest4.txtだったとして、

abc
abc
123
ABC
ZZZ
abc
123
xyz
ABC
XXX
YYY

下記のコマンドを実行すると、

diff test3.txt test4.txt

出力結果は以下のようになります。

2d1
< abc
3a3
> xyz
5c5,6
< ZZZ
---
> XXX
> YYY

上記結果の2d1、3a3、5c5,6の部分は、数字の間にあるアルファベット1文字が右のファイルに対し、a:追加、d:削除、c:変更されたことを表しており、そのアルファベット1文字の左右にある数値で対応する行番号を示しています。

5,6のようにカンマ区切りで行番号が記載される場合は5〜6行目という意味になります。

これに続いて、ファイル中の差分として、第1引数で指定したファイルにのみ存在する行には<を付けて、第2引数で指定したファイルにのみ存在する行には>を付けて表現されています。

<, >を←, →の矢印と思えばわかりやすいです。

sdiff

このコマンドも2つのファイルの差分を出力しますが、視覚的に見やすくなっています。

sdiff ファイル1 ファイル2

主なオプションとして以下があります。

オプション説明
-w 数値結果出力の際の横幅(文字数)を指定する
-b空白の個数の違いを無視する
-B空の行を無視する

例えばdiffコマンドの説明にあるtest3.txttest4.txtを使って下記のコマンドを実行すると、

sdiff -w 20 test3.txt test4.txt

出力結果は以下のようになります。

abc	abc
abc   <
123	123
      >	xyz
ABC	ABC
ZZZ   |	XXX
      >	YYY

2つのファイルの内容が左右に並べて表示され、中央に<が記載された行は左のファイルのみにあることを表しており、同様に>は右のファイルにのみあること、|は左右で違いがあることを表しています。

これは人間が見て差分を理解しやすいですね。

追加インストールが必要ですが、vimdiffgvimdiffというコマンドがあり、色付きで、さらに差分を視覚的に把握しやすくなっていますので、興味がある方はググってください。

comm

ソート済みの2つのファイルの差分(過不足)を調べます。

comm ファイル1 ファイル2

主なオプションとして以下があります。

オプション説明
-1ファイル1のみに含まれる行を出力しない
-2ファイル2のみに含まれる行を出力しない
-3ファイル1とファイル2の両方に含まれる行を出力しない

以下の左がtest5.txt、右がtest6.txtだったとして、

123
ABC
abc
abc
321
ABC
XYZ
abc
xyz

下記のコマンドを実行すると、

comm test5.txt test6.txt

出力結果は以下のようになります。

123
	321
		ABC
	XYZ
		abc
abc
	xyz

3列に分かれていて、左から、第1引数のファイルのみに存在するもの、第2引数のファイルのみに存在するのも、両方に存在するもの、を表しています。

以下のように-23オプションを付けて実行すると、

comm -23 test5.txt test6.txt

出力結果は以下のように第1引数のファイルに存在するものだけが表示されます。

123
abc

paste

複数のファイルを横並びで結合します。

paste ファイル1 ファイル2 ...

主なオプションとして以下があります。

オプション説明
-d区切り文字列結合の区切り文字を指定する

以下の左がtest5.txt、右がtest6.txtだったとして、

123
ABC
abc
abc
321
ABC
XYZ
abc
xyz

下記のように区切り文字指定無しでコマンドを実行すると、

paste test5.txt test6.txt

タブで区切られて以下のように出力されます。

123	321
ABC	ABC
abc	XYZ
abc	abc
	xyz

カンマ区切りで出力したい場合は以下のようにします。

paste -d, test5.txt test6.txt

出力結果は以下のようになります。

123,321
ABC,ABC
abc,XYZ
abc,abc
,xyz

tar

ファイル・ディレクトリとその配下のファイル・ディレクトリを1つのファイル(〜.tar)に固めます。

tar 機能文字列 固めるファイル名 固める対象のファイル...

Linuxではファイルの拡張子と機能の結びつきは弱く、ファイル名は何でも良いのですが、tarによって作られたファイルは〜.tarとしておく慣習があります。

この方が後から見てもtarで作成したことがわかりやすく、他の人にもやさしいですね。

主な機能文字列として以下があります。

機能文字列説明
c固める
x展開する(cの逆)
t中身を表示する
vtとセットで中身を詳しく表示する
hシンボリックリンクを通常のファイル/ディレクトリとして扱う
zc, x, tの際にgzip圧縮/展開を使用する
fファイルを指定する(fは機能文字列の最後にする)

例えば、以下のファイル・ディレクトリ構造を固める場合、

dir1/file1
dir1/file2
dir2/file3

以下のように実行すると、

tar cf archive.tar dir1 dir2

archive.tarというファイルが作成されます。

このファイルの中身を確認する以下のコマンドを実行すると、

tar tvf archive.tar

以下のように表示されます。

drwxr-xr-x  0 user   staff       0  1  9 03:36 dir1/
-rw-r--r--  0 user   staff       7  1  9 03:36 dir1/file2
-rw-r--r--  0 user   staff       6  1  9 03:36 dir1/file1
drwxr-xr-x  0 user   staff       0  1  9 03:37 dir2/
-rw-r--r--  0 user   staff      11  1  9 03:37 dir2/file3

ここでtmpというディレクトリを新たに作ってその下で展開してみます。

mkdir tmp
cd tmp
tar xf ../archive.tar

すると、tmpディレクトリ配下に以下のファイル・ディレクトリが展開されます。

dir1/file1
dir1/file2
dir2/file3

gzip

gzip形式のファイル圧縮をします。

gzip ファイル名

これで「ファイル名.gz」というファイルに圧縮されます。

主なオプションとして以下があります。

オプション説明
-c標準出力から入力する

gunzip

gzip形式で圧縮されたファイルの展開をします。

gunzip ファイル名.gz

これで「ファイル名」のファイルに展開されます。

主なオプションとして以下があります。

オプション説明
-c標準出力から入力する

bzip2

bzip2形式でファイルを圧縮します。

一般にgzipよりも圧縮後のファイルサイズが小さくなります。

bzip2 ファイル名

これで「ファイル名.bz2」というファイルに圧縮されます。

主なオプションとして以下があります。

オプション説明
-c標準出力から入力する

bunzip2

bzip2形式で圧縮されたファイルの展開をします。

bunzip2 ファイル名.bz2

これで「ファイル名」のファイルに展開されます。

主なオプションとして以下があります。

オプション説明
-c標準出力から入力する

grep

ファイル内に指定した文字列があるか検索し、マッチした行を出力します。

検索文字列として正規表現が使えます。

正規表現を使用できるコマンドをいくつか紹介しますが、コマンド毎に使用できる表現に差があり、以下のページで説明していますので、ご覧ください。

grepは使用頻度の高い便利コマンドで、Linuxのターミナルから離れたくないと思わせるものの1つと言えるでしょう。

grep 検索文字列 入力ファイル

主なオプションとして以下があります。

オプション説明
-i大文字、小文字を区別しない
-vマッチしなかった行を出力する(マッチした行は出力しない)
-lマッチしたファイル名を出力する
-cマッチした行数を出力する
-E拡張正規表現を使えるようにする

egrep

grepと同様にファイル内の文字列を検索してマッチした行を出力するコマンドで、拡張正規表現を使用した検索(grep -Eと同等)ができます。

egrep 正規表現 入力ファイル

主なオプションとして以下があります。

オプション説明
-i大文字、小文字を区別しない
-vマッチしなかった行を出力する(マッチした行は出力しない)
-lマッチしたファイル名を出力する
-cマッチした行数を出力する

sed

正規表現を使用した文字列置換を行います。

sed 's/正規表現/置換文字列/' 入力ファイル

主なオプションとして以下があります。

オプション説明
-e コマンドコマンドが1つのときは-eを省略可能(上記コマンド例のように)、複数コマンド指定は-e コマンドを複数指定する
-E拡張正規表現を使えるようにする

以下のページにsedの使用例を多数記載していますので、参考にしてください。

find

ファイルを様々な方法で探すためのコマンドです。

非常に便利なコマンドで、一度慣れてしまうと、findが無い環境は使いたくないと思うようになります。(^^;

find ディレクトリ オプション

主なオプションとして以下があります。

オプション説明
-name ファイル名ファイル名を指定、*を使用した表現が可能(*を使う場合は””で囲う)
-type タイプタイプにf(ファイル)またはd(ディレクトリ)を指定して検索対象を限定する
-exec コマンド 検索結果に対し、指定したコマンドを実行する
-printファイル名を出力する(よく-execとセットで使う)

-nameオプションの使用例を以下に示します。

find /home/user/work -name "*.md"

これでファイル名が〜.mdであるものが見つかります。

lsで探す場合との違いは、lsは指定したディレクトリの直下にあるファイルを出力するのに対し、findは指定したディレクリ以下のすべてのディレクトリを下っていって探してくれます。

次に-execオプションの使用例を示します。

これは少しコマンドが長くなり、難しく見えると思いますが、使いこなすと便利なので、ぜひ身につけてください。

例えば、カレントディレクトリまたは、そのさらに下のディレクトリにあるファイルのうち、ファイル内に”ABC”という文字列を含むものを探している場合、コマンドは以下のようになります。

find . -type f -exec grep ABC '{}' \; -print

何やら難しい呪文のように見えますよね。(^^;

順を追って説明すると、まず、findに続く.(ドット)はカレントディレクトリを表しており、これによりfindはカレントディレクトリとそれ以下のディレクトリすべてを探しに行きます。

次が-type fですが、これは探す対象をファイルに絞っているということになります。

このコマンドの目的として見つかったファイルを入力にしてgrepを実行したい訳ですが、ディレクトリを入力にしてgrepを実行するとエラーになってしまうので、それを回避するために対象をファイルに絞っています。

次に出てくるのが、-exec grep ABC '{}' \;です。

findで見つかったファイルを入力にしてgrepコマンドを実行し、ABCという文字列を検索しています。

‘{}’は何かというと、findで見つかったファイルをこの部分に当てはめるという意味になります。

つまり、カレントディレクトリとそれ以下のディレクトリに存在するファイルすべてが検索結果であり、そのファイルを1つずつ'{}'の部分に当てはめてgrepコマンドが実行されます。

\;-execオプションにコマンドの終わりを教えてあげるためのものですが、単に;とするとfindコマンドの終わりとして解釈されてしまうため、\を付けて単なる文字として扱われるようにしています。

これでABCを含む行が表示されます。

最後に-printですが、これは-execで指定したコマンドを実行した結果が真だった場合、つまりABCという文字列を含んでいた場合に、そのファイル名を出力するオプションになります。

これを付けないと単にABCを含む行が表示され、どのファイルに含まれていたのかがわからなくなってしまいます。

文献紹介

詳説 正規表現

奥の深い正規表現の世界を余すところなく解説してくれる一冊で、さまざまなツールにおける使用例もあり、正規表現を極めたい方向けの書籍です。


sed & awkプログラミング

UNIX/Linuxのコマンドラインを使いこなす上で必須となるsedとawkのノウハウが詰まった、バイブルとも言える一冊です。


新しいLinuxの教科書

Linuxの基本的な使い方からシェルスクリプトを使ったプログラミング、Gitによるバージョン管理など、エンジニアが知っておくべき基本的な知識について解説してくれています。

参考文献

タイトルとURLをコピーしました