こんにちは、Яeiです。
今回は現役エンジニアの私が、これだけは覚えておきたいLinuxコマンドについて解説していきたいと思います。
サーバサイドの環境はLinuxが良く使われておりますが、GUIに慣れているとやはりコマンド操作は難しく感じると思います。
そこで、今回はそんな皆様に向けて、とりあえず最低限レベルのLinuxコマンドについて話をしていきたいと思います。
少なくとも、ここら辺を知っておけば最低限の操作が出来ると思います。
後は、適宜必要に応じて調べて知識を深めればよいことでしょう。
なお、パソコンのファイルシステムの話は最低限の知識として知っておいてもらいたいので「何だそれは?」という方は以下の記事をご参照下さい。
目次
なぜ今更Linuxコマンドなのか
GUIベースで開発をしている人にとって、今更Linuxコマンドを覚える必要性に疑問を抱くかもしれません。
もちろんその通りで、使わない人にとっては興味があまりない話かもしれません。
ただし、以下のような需要は度々耳にします。
・普段は使わないけど、たまに使うことがある(その際は手順書通りにやっていて何をやっているのか実は分かっていない)
・自分で学習する際にLinuxの設定が必要だったりする
・今後のIT時代において、Dockerを学び始めるにあたってLinux操作が必要となる
特に今後、一番下のクラウドネイティブ化の普及に伴い、Linux需要は必須となるのではないでしょうか。
そうした際に、Linux操作は必須であり、また調べ後とをしていても前提として説明なく記載されていることでしょう。
(Dockerに限らず、今までもAWSなど自前でインスタンスをいじる際も必要でしたね)
そこで、ここではマニアックな話は小難しい話は置いておいて、最低限必要なLinuxコマンドという観点で解説したいと思います。
最低限覚えておきたいコマンドまとめ
注意点として、WindowsでいうフォルダはLinuxではディレクトリと呼ぶことが多いようです。
そのため、ここではフォルダをディレクトリと呼ぶことにします。
ls
Listの略。
カレントディレクトリ(今自分がいるディレクトリ)のファイルやディレクトリ情報を出力してくれます。
$ ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr varls
オプションを含めて最低限覚えておきたいのは以下になります。
①ls -ltr
②ls -a
③ls -1
①は詳細情報を含めて表示
②は隠しファイルやディレクトリも表示(①と組み合わせてもOK)
③ファイル名のみ表示(改行して表示してくれる)
以下、コマンドをたたいた際の違いを見てみて下さい。
$ ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
$ ls -ltr
total 64
drwxr-xr-x 2 root root 4096 Jun 13 19:30 boot
drwxr-xr-x 1 root root 4096 Jun 21 09:00 var
drwxr-xr-x 1 root root 4096 Jun 21 09:00 usr
drwxr-xr-x 2 root root 4096 Jun 21 09:00 srv
drwxr-xr-x 2 root root 4096 Jun 21 09:00 sbin
drwxr-xr-x 3 root root 4096 Jun 21 09:00 run
drwx------ 2 root root 4096 Jun 21 09:00 root
drwxr-xr-x 2 root root 4096 Jun 21 09:00 opt
drwxr-xr-x 2 root root 4096 Jun 21 09:00 mnt
drwxr-xr-x 2 root root 4096 Jun 21 09:00 media
drwxr-xr-x 2 root root 4096 Jun 21 09:00 lib64
drwxr-xr-x 1 root root 4096 Jul 11 16:58 bin
drwxr-xr-x 1 root root 4096 Jul 11 17:21 home
drwxrwxrwt 1 root root 4096 Jul 11 17:21 tmp
drwxr-xr-x 1 root root 4096 Jul 11 17:21 lib
drwxr-xr-x 1 root root 4096 Jul 31 21:14 etc
dr-xr-xr-x 134 root root 0 Jul 31 21:14 proc
dr-xr-xr-x 13 root root 0 Jul 31 21:14 sys
drwxr-xr-x 5 root root 360 Jul 31 21:14 dev
$ ls -a
. .dockerenv boot etc lib media opt root sbin sys usr
.. bin dev home lib64 mnt proc run srv tmp var
$ ls -1
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
cd
Change Directoryの略。
自分が今いるディレクトリから他のディレクトリに移動することができます。
cd 【移動先のパス】
移動先のパスは「相対パス」「絶対パス」が指定可能となります。
ちなみに、移動先のパスを指定しないで「cd」のみ指定した場合は、ホームディレクトリに移動します。
例は以下のようになります。
①絶対パス指定
$cd /home/rei/
②相対パス指定
$cd ./../../var/
③未指定(ホームディレクトリへ移動)
$cd
pwd
Present Working Directoryの略。
現在作業しているディレクトリの絶対パスを表示してくれます。
$pwd
/home/rei
mkdir
Make Directoryの略。
ディレクトリを作成します。
mkdir 【作成したいディレクトリ名】
作成したいディレクトリ名は相対パス指定でも絶対パス指定でも可能です。
$ pwd /home/
/home/rei
$ mkdir ./test1
$ ls
test1
ただし、間にはさまるディレクトリが存在しない場合はエラーになります。
例えば、ホームディレクトリにsampleディレクトリがない状態でsampleディレクトリは以下にtest2ディレクトリを作ろうとすると以下のようにエラーになります。
$ pwd
/home/rei
$ ls
test1
$ mkdir ./sample/test2
mkdir: cannot create directory './sample/test2': No such file or directory
この場合、以下のように「-p」オプションを付けることで存在しないディレクトリも一気に作成してくれます。
mkdir -p 【作成したいディレクトリ名】
先の例ですと以下の通りとなります。
$ mkdir -p ./sample/test2
$ ls sample/
test2
ただし、こちらのオプションを使う場合、予期せぬものを作ってしまったりとトラブルの元になったりもするので、個人的にはあまりお勧めは致しません。
cp
Copyの略。
ファイルやディレクトリをコピーします。
cp 【コピー元ファイル名】 【コピー先ファイル名】
cp -r【コピー元ディレクトリ名】 【コピー先ディレクトリ名】
ファイルやディレクトリのコピーを実施します。
多くの場合、「-p」オプションと一緒に使いますので覚えておきましょう。
「-p」オプションはコピーする際にタイムスタンプ情報などもコピー元情報を引き継ぎます。
以下の例ではtry.txtはコピー元情報を引き継ぐ設定でコピーし、sample.txtは引き継がない設定でコピーしました。
sample.txtの方はタイムスタンプが更新されているのが分かると思います。
$ cp test.txt sample.txt
$ cp -p test.txt try.txt
$ ls -ltr
-rw-r--r-- 1 rei rei 36 Jul 31 21:41 test.txt
-rw-r--r-- 1 rei rei 36 Jul 31 21:41 try.txt
-rw-r--r-- 1 rei rei 36 Jul 31 21:47 sample.txt
ディレクトリのコピーについては、サブディレクトリも一緒にコピーして
/* Your code... */
くれます。
$ ls -ltr sample
total 4
drwxr-xr-x 2 rei rei 4096 Jul 31 21:33 test2
$ cp -pr sample test
$ ls -ltr test
total 4
drwxr-xr-x 2 rei rei 4096 Jul 31 21:33 test2
mv
Moveの略。
ファイルやディレクトリを移動したい場合に使います。
また、その使い道からファイルやディレクトリのリネーム用途としても使います。
mv 【移動元】 【移動先】
リネームの場合は以下のような感じ(ディレクトリのリネーム)。
$ mv sample/ lesson
移動の場合は以下のような感じ。
$ mv lesson/ test/
$ ls test
lesson/ sample.txt test.txt test_sub/
なお、cpコマンドとmvコマンドの注意点として、以下のサイトがとても参考になりますので一読されると良いでしょう。
参考
そのファイル、安全に更新できていますか?(アトミックなファイル操作:前編)HEARTBEATS
例えば、絶賛コピー中のファイルをコピー元にcpコマンドを打った場合に、正しくコピーできないことがありますよ。
といったような話になります。
cat
Catenateの略。
ファイルの中身を表示してくれます。
cat 【ファイル名】
特に難しいこともなく、以下のようにシンプルに使います。
$ cat test.txt
test1
test2
ただし、うっかりバイナリファイルを見てしまったり、デッカイファイルを見てしまうと悲劇を見ますのでご注意下さい。
(固まったり、結果が永遠と表示され続けてなかなか返ってこなかったり)
なお、標準出力以外で確認したい場合は「more」「less」「vi(vim)」などで確認するのが良いです。
※ touchコマンドではファイル作成が可能となりますが、空ファイルの作成となりますので、viなどで作成した方がよいでしょう。
diff
Diffefenceの略。
テキストファイルの差を表示してくれます。
diff 【ファイル1/ディレクトリ1】 【ファイル2/ディレクトリ2】
単純に比較すると以下のように表示されます。
$ cat test.txt
test1
$ cat sample.txt
sample1
$ diff test.txt sample.txt
1c1
< test1
---
> sample1
覚えておくと便利なオプションとしては「q」「r」でしょうか。
「q」オプションはファイルが異なるか否かだけを表示してくれます。
$ diff -q sample.txt test.txt
Files sample.txt and test.txt differ
rについてはディレクトリ指定した際に、サブディレクトリも再帰的に比較してくれます。
$ diff test sample/
Common subdirectories: test/test_sub and sample/test_sub
$ diff -qr test sample/
Only in sample/test_sub: a.txt
Files test/test_sub/test_sub.txt and sample/test_sub/test_sub.txt differ
env
Environmentの略。
環境変数を表示してくれます。
$ env
環境変数周りでの注意点ですが、cronと呼ばれるスケジューラ昨日からシェルを呼び出している場合があります。
その場合に、cronから起動するシェルは.bash_profileなどの設定ファイルを読み込みません。
以下まとめて下さっているサイトがあるのでご参照下さい(bash限定ですが)。
参考
bashの設定ファイル(.bash_profile, .bashrc等)がどんなときに読み込まれるかまとめQiita
rm
Removeの略。
ファイルやディレクトリの削除を行います。
rm 【ファイル名】
rm -r 【ディレクトリ名】
rmコマンドで使われがちなオプションとしては「i」「f」あたりとなります。
「i」オプションは削除する前に「本当にいいの?」と確認してくれます。
yを入力すれば削除、nで削除しないように選びます。
$ rm -i tsts.log
rm: remove regular file 'tsts.log'? y
fオプションは削除対象がない場合にエラーを表示してくれないでスルーしてくれます。
存在しないファイルを削除すると以下のようにエラーになります。
$ rm tsts.log
rm: cannot remove 'tsts.log': No such file or directory
fオプションをつけることでエラーもなく、何事もなかったかのようにふるまいます。
grep
Global Regular Expression Printの略。
grepはファイル内の文言を検索してくれます。
grep 【検索文言】 【検索対象】
ポイントは「検索対象」にはワイルドカードが使える点となります。
以下のような用法を覚えておけば、結構便利になりますので覚えておきましょう。
カレントディレクトリにおいて、拡張子が.txtのファイルのうち、「sample」という文言を含むファイルを検索。
$ grep sample *.txt
sample.txt:sample1
なお、以下のfindと組み合わせるとさらに便利になりますのでセットで覚えておくと少しばかりLinux使いに近づきますよ。
find
Findの略。
条件に合致するファイルを検索してくれます。
色々な使い方がありますが、だいたい以下二つくらい覚えておけば何とかなります。
①ファイル名、ディレクトリ名検索
find 【ディレクトリ】 -type 【ファイルまたはディレクトリ(f / d)】-name 【ファイル名/ディレクトリ名】
※ ディレクトリはカレントディレクトリ(.)指定する場合が多い印象です。
※ ファイルまたはディレクトリにはf(ファイルのみ検索対象)またはd(ディレクトリのみ検索対象)を指定します。ただし、-typeオプションと共に指定しない場合は両方検索対象となります。
※ ファイル名、ディレクトリ名部分はワイルドカード指定ができます。
例:カレントディレクトリ配下のファイルに対して、test始まりのファイルを検索する。
$ find . -type f -name "test*"
./test.txt
./test_sub/test_sub.txt
xargs
略不明。
(なんちゃらArgumentsの略だとは思いますが。Execute Arguments説もあるが真偽不明)
これは使い方が特徴的なコマンドでして、パイプで流れてくる情報をxargs以降に指定するコマンドの引数に流してくれるコマンドとなります。
コマンド1 | xargs コマンド2
実際に見てもらうのが早いと思います。
例えば、先ほどのfindコマンドを実行すると以下のようにファイル一覧が結果として表示されます。
$ find . -type f
./sample.txt
./test.txt
./test_sub/a.txt
./test_sub/test_sub.txt
ここで、先ほどgrepコマンドを扱ったと思いますが、こららのファイルに対してgrepコマンドを使えたら、
ファイル内の文言検索がさらにはかどることでしょう。
そこでxargsの出番です。
$ find . -type f | xargs grep sample
./sample.txt:sample1
このように、組み合わせてあげることですべてのファイルに対して文言検索ができるようになりました。
ここでは一例となりましたが、まだまだ用途もあり奥が深いコマンドとなります。
vi(vim)の使い方
最後に、Linuxコマンドではありませんがvi(vim)の使い方についても見ておきましょう。
恐らく、多くのLinuxユーザが最初にぶつかるであろう壁がこのviだと思います。
viとはVisual Editorの略で、名前の通りエディタとなります。
元々はedとかexと呼ばれえるラインエディタでファイル編集を頑張っていたのですが、あまりにも使い勝手が悪かったのでviが登場しました。
で、そのviをさらにパワーアップさせたのがvimとなります(Vi IMprovedの略)。
ここでは最低限、ということなのでviの使い方を説明致します。
vimに興味がある方は適宜調べてもらえればviよりさらに便利になった機能を使うことが出来ると思います。
なお、以下で紹介する方法は個人的に便利なので使っている方法でして、他にも方法はいくつもあると思いますので興味のある方は調べてみて下さい。
ファイルを開く/作る
ファイルを開く場合は以下のようにコマンドを実行します。
vi 【ファイル名】
ここで、ファイルが存在しない場合は新規作成してくれます。
そのため「touchコマンドで空ファイルを作って、viで編集」みたいなことをせずにいきなりviでファイル作成できます。
なお、ファイルを読み取り専用で開きたい場合はviではありませんが以下のコマンドを実行しましょう。
view 【ファイル名】
例
$ vi sample.txt
編集(概要)
viユーザの頭を悩ませるポイントがこの編集難度になります。
viには
・インサートモード
・コマンドモード
の2種類があり、使い分けないといけません。
インサートモードは文字を書く際のモードで、コマンドモードではファイルを保存したり、カーソル移動したりと決められた操作ができます。
デフォルト状態はコマンドモードになりますので、文字を書きたい場合はわざわざ切り替える必要があるのです。
viユーザの鉄則を先にお教えいたします。
困ったらESCを連打
これだけ知っておけば幸せなviライフ間違いありません。
ESCを押すことでインサートモードからコマンドモードへと切り替わります。
そのため、自分が今何のモードなのか分からなくなる時がありますが、困ったときはESCでコマンドモードに戻りましょう。
なぜ連打なのかというと、変なコマンドを実行してしまった場合など、一回だけだとコマンドモードに返ってこれない時が稀にあるからです。
編集(コマンドモード)
コマンドモードでは色々なことができます。
ここでは中でも良く使うものを紹介致します。
インサートモードに切り替え:
i :インサートモードに切り替え
(aでも切り替わりますが、ややこしいので省略。試してみて使いやすい方、あるいは両方使い分けるとよいです)
これでインサートモードに切り替わりますので、文字を入力し、入力がおわったらESCを押します。
改行:
o:改行+インサートモードに切り替え
移動コマンド:
j :下に移動
k:上に移動
h:左に移動
l :右に移動
※ 最近では矢印キーでも移動できるようになっていると思います。
ただし、viについてはこの移動方法の方がキー配置的に早く、オススメだそうです。
(確かに慣れれば矢印キーより快適です)
行のコピー:
yy:行のコピー
ペースト:
p:コピーした行をペースト
行の削除:
dd:行の削除
単語単位で移動:
w:一つ後の単語まで移動
b :一つ前の単語まで移動
1ページ分スクロール:
Ctrl+f :1ページ分下にスクロール
Ctrl+b:1ページ分上にスクロール
保存:
q! :何もしないで終了(変更を加えていても破棄)
w! :強制的に保存
wq!:強制的に保存して終了
※ !をつけなければ強制的には実行されません。
戻す:
u :その行の修正を一回分元に戻す
U :その行の修正をすべて元に戻す
:e!:そのファイルへの変更を最終保存状態まで戻す
移動:
:行番号
行単位の移動系はこの方法が楽です。
行番号が表示されていない場合は「:set nu」とすることで表示されるようになります。
(設定を保存したい場合は.bash_profileなど適宜追記が必要となります)
検索:
/検索文言
n:次の検索文字へと移動
N:前の検索文字へ移動
検索する際はESC押して確実にコマンドモードに移動してから検索。
検索が終わった後はESCで確実にコマンドモードに戻りましょう。
他にも、たくさんの機能があって奥が深いのがviの世界です。気になる方は是非是非調べてみて下さい。
圧倒的おすすめは以下になります(中古だとかなりお求めやすい価格ですよ)。
当記事は以上となります。
今回はLinuxコマンドについて解説致しました。
ここで紹介した内容は「最低限」となりますので、まだまだ覚えるべきことはたくさんあります。
ただし、ここまで知っていれば最低限はなんとかなると思います。是非、実際に手を動かして覚えていって下さい。
長々とお疲れさまでした!