本記事は「ものづくりのためのLinux講座」のうちの基本コマンドに関する内容です。
よく使うコマンドや機能を短期間で使いこなせるようになることを目指した内容になっています。
そのため、あらゆる機能を網羅することは重視していません。
ls
ファイル、ディレクトリの一覧を表示するコマンドで、最も使用頻度の高いコマンドです。
以下のように引数無しで実行すると、現在いるディレクトリ(カレントディレクトリ)のファイルを表示します。
ls
以下のようにディレクトリやファイルを指定して実行することもできます。
ls ディレクトリ(またはファイル)
主なオプションとして以下があります。
オプション | 説明 |
---|---|
-l | 詳しい情報を表示 |
-a | .(ドット)から始まる隠しファイルも表示 |
-1 | 1列で表示 |
-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 | ディレクトリごとコピーする |
-p | umaskを無視してコピー元の属性を維持する |
ディレクトリとその配下のファイル・ディレクトリもコピーしたい場合は以下のように-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 入力ファイル
各キーと機能の割り当ては以下です。
キー | 機能 |
---|---|
Space | 1画面送る |
b | 1画面戻る |
Enter | 1行送る |
q | 終了する |
less
less
もcat
やmore
と同様にファイルの中身を表示しますが、よりvi
エディタに近い機能になっています。
less 入力ファイル
各キーと機能の割り当ては以下です。
キー | 機能 |
---|---|
Space | 1画面送る |
b | 1画面戻る |
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.txt
とtest4.txt
を使って下記のコマンドを実行すると、
sdiff -w 20 test3.txt test4.txt
出力結果は以下のようになります。
abc abc abc < 123 123 > xyz ABC ABC ZZZ | XXX > YYY
2つのファイルの内容が左右に並べて表示され、中央に<が記載された行は左のファイルのみにあることを表しており、同様に>は右のファイルにのみあること、|は左右で違いがあることを表しています。
これは人間が見て差分を理解しやすいですね。
追加インストールが必要ですが、vimdiff
やgvimdiff
というコマンドがあり、色付きで、さらに差分を視覚的に把握しやすくなっていますので、興味がある方はググってください。
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 機能文字列 固めるファイル名 固める対象のファイル...
主な機能文字列として以下があります。
機能文字列 | 説明 |
---|---|
c | 固める |
x | 展開する(cの逆) |
t | 中身を表示する |
v | tとセットで中身を詳しく表示する |
h | シンボリックリンクを通常のファイル/ディレクトリとして扱う |
z | c, 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 コマンド | 検索結果に対し、指定したコマンドを実行する |
ファイル名を出力する(よく-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を含む行が表示され、どのファイルに含まれていたのかがわからなくなってしまいます。
文献紹介
奥の深い正規表現の世界を余すところなく解説してくれる一冊で、さまざまなツールにおける使用例もあり、正規表現を極めたい方向けの書籍です。
UNIX/Linuxのコマンドラインを使いこなす上で必須となるsedとawkのノウハウが詰まった、バイブルとも言える一冊です。
Linuxの基本的な使い方からシェルスクリプトを使ったプログラミング、Gitによるバージョン管理など、エンジニアが知っておくべき基本的な知識について解説してくれています。
参考文献
- ものづくりのためのLinux講座【正規表現】(https://take6shin-tech-diary.com/linux_regexp/)