【Linux初級者向け】僕がLinuxをスムーズに操作できるようになるために心がけてきたことを晒してみる

会社に入って研修が終わり、配属されてからやっと ```cd``` コマンドを覚えた僕が、より効率的にLinuxを操作ができるようなるためにと先輩に言われたり日頃意識していることをまとめてみます。（コマンドの説明、というよりは心得のようなものです）

Linuxは始めて触る人にとっては「なんでこんな使いづらいもの使わなきゃいけないの？！GUIの劣化版じゃん！」的な感想を持つことも珍しくないと思うのですが、この記事の内容を参考に、少しでもLinuxに慣れ、Linuxのパワフルさを実感していただけたら幸いです。

実際、慣れるとGUIの劣化版どころか作業内容によってはGUIよりもはるかに効率よく作業することができたりするので、途中で諦めずに自由に使えるようになってみると仕事のスピードが一気に上がり、楽しくなってくるはずです。

※ 実際はLinuxにもGUIで操作できるディストリビューションがありますが、この記事ではイメージのしやすさを優先して「Linux = CUIのLinux環境」という前提で書いていきます。また、僕がよく使っているのはCentOSですので、CentOS固有の内容もあるかもしれません。

では、どうぞ。

# Linuxを触りはじめたころ

## とにかく ```tab``` を打つ

Linuxの操作で最もGUIに優れていることの一つが、 ```tab``` キーによる自動補完です。
ファイルを指定する際は一文字打っては ```tab```、というくらいの頻度で打つように癖をつけることで、フォルダダブルクリックでは実現できないような速さで階層を下り、目的のファイルにたどり着くことができます。

Linuxでは一文字でもタイプミスしたら「ファイルがありません」扱いになってしまうため、自分でファイル・ディレクトリ名をタイプするのは（たとえ暗記に自信があったとしても）最低限にとどめておくのが吉です。

## ```cd``` したらとりあえず ```ll```（```ls -l```）しておく

Linuxの操作では、何かコマンドを打った結果何が起こったか、というのがGUIに比べて分かりづらい場合が多いです。

例えば```cd``` は特によく使うコマンドですが、 ```cd``` した結果どうなったのかは画面には全く現れません（一応失敗した場合は ```"No such file or directory"``` と言ってはくれますが、目立たないため気づかない場合が多いです）。

```cd``` した結果想定通りのディレクトリに移動できたかを確かめるために、 ```cd``` したら必ず ```ls -l``` するのが良いよ、と最初に先輩から教わりました。また、```cd``` だけでなく、何かファイルを追加したり変更したりするような操作をした時にも同じように```ll```するようにしています。

ちなみに、```ls -l``` はよく使うコマンドなためか、環境によってはデフォルトで ```ll``` にエイリアスが設定しあるようです。設定されてなかったとしても ```alias ll='ls -l'``` を ```.bashrc``` 等に記載しておけば使えるようになります。便利です。

## history や Ctrl + r で過去に実行したコマンドを使いまわす

Linuxの操作をしていると、割と頻繁に過去に打ったコマンドと同じコマンドを実行する（もしくは一部を変更して実行する）ことが多いです。そんなとき、改めて０からタイプし直すのではなく、履歴機能を使うことでミスなく、素早くコマンドを再実行することができます。

```history``` は今まで打ったコマンドを一覧するコマンドです。1000件程度記憶してくれているようです。
一覧には番号が振ってありますので、そのまま実行したい場合は　```![番号]``` で、一部を変えたい場合はコピペするか後述の ```Ctrl + r``` を使うと良いでしょう。

また、```history``` だけだと ```cd``` や ```ls``` なども多く含まれて見づらいため、 ``` | grep [文字列] ``` というように ```grep``` と組み合わせるとさらに目的の履歴を見つけやすくなります。

```Ctrl + r``` に続けて文字をタイプすることで、その文字が含まれる履歴を実行された時間が近い順に遡って表示してくれます。実際に使ってみるのが早いのですが、続けてタイプする文字を増やしていくことでより詳細に絞り込み、さらに ```Ctrl + r``` をタイプすることでより過去の履歴に遡ります。

再実行したいコマンドの一部の文字列でも分かっている場合で、前に実行したのが最近である場合はこちらの方が早いです。また、履歴を表示した後編集もできるので、以前実行したコマンドから一部を変えたい場合にも便利です。

## Ctrl + c で入力中のコマンドを全消しする

コマンドのタイプ中、「あ、やっぱりこれじゃなくってあっちのコマンドを先に実行しなきゃ」となった場合、バックスペースでいちいちタイプ中のコマンドを消していくのではなく、 ```Ctrl + c```で全消ししてしまうのが速く、正確です。

注意としては、```Ctrl + c``` はコマンドの実行中にタイプすると実行中の処理を中断してしまうため、タイミングを間違えると大変なことになる危険性もあると言えばあるのですが、とは言えバックスペースで一文字ずつ戻った結果消し忘れが発生した、というミスもそれはそれで危険ですので、僕は積極的に```Ctrl + c``` を使うのが良いと思っています。

（2016/10/06 追記）
打ちかけのコマンドの全消しについて、コメントにて「```Ctrl + a```（カーソルを先頭に移動） してから ```Ctrl + k```（カーソルより後を全消し）するという方法を教えていただきました。タイプ数は増えますが、 ```Ctrl + k```で削除した内容は```Ctrl + y```で復元できますので、一旦消した内容を後回しで使いたい場合はこちらの方が便利です。@iwaim@github さん、ありがとうございます！

## ```exit``` ではなく ```Ctrl + d``` を使う

Linux操作を終了するときは ```exit[Enter]``` とタイプするのではなく ```Ctrl + d``` を使います。
理由は単純に「5回タイプするよりも1回のタイプで済ませた方が速いから」です。

5回も１回も、タイピングに自信のある人にとっては些細な違いかもしれませんが、その５回の間にタイプミスして修正したり、ミスに気づかないまま Enter キーを押してしまう危険性を考えれば、たかだか4文字の差だけではないことがわかるかと思います。

Linuxの操作ではちょっとしたタイプミスが大きな事故につながることも珍しくないため、いかにタイプ量を減らして人間的なミスをなくし、且つ機械の力で素早く作業を進めるかが鍵になります。そのため、ちょっとしたタイプ量の節約も大きな意味を持つのです。

## Ctrl + u でパスワードの打ち間違えを修正する

これを知る前は、ログイン時などのパスワード入力でタイポしたことに気づいた場合、上述の```Ctrl + c```で一旦中断してから再度同じコマンドを実行してパスワードを入力し直していたのですが、別のサーバーに ```ssh``` する時はネットワークの関係でコマンド実行からパスワード入力状態になるまで少し間があることが少なくありません。

そんな時、わざわざ間違えるたびに```Ctrl + c```していては時間が無駄にかかってしまいますので、```Ctrl + u```という方法があることを覚えておくと良いです。タイポに気づいたら ```Ctrl + u``` することで、入力しかけのパスワードを最初から打ち直すことができます。

## とにかくLinux環境に触れてコマンドの実行に慣れる

身も蓋もないのですが、やはり慣れるためには数が必要です。
最近は Vagrant や AWS の EC2 など、気軽にLinux環境を手に入れて、不都合があれば気軽に破棄できる方法がたくさんありますので、自由に使えるサーバーなんてないよ！という方もこれらを活用して「自由に操作できる」Linux環境を手に入れてみることをオススメします。

何か起きても全く問題のない環境で好きなようにコマンドを試すことで、何をしたらどうなるのかを身を持って知ることができます。

「何が起きても全く問題のない環境」を手に入れることで[こんなこと](https://cpplover.blogspot.jp/2014/06/rm-rf.html)も安心して実験できたりします。

# ちょっと慣れてきたら

## カーソルキーを使わない

カーソルキーは、ホームポジションから遠い位置にあることが多く、またキーボードによっても場所がまちまち（ものによってはそもそも付いていない）なことが多く、カーソルキーに頼らない方が安定して効率的に作業ができます。
右左の移動は Ctrl + f / b ででき、上下の履歴参照は上述のように```history```コマンドか```Ctrl + r```でできますので、カーソルキーを使うとしたら本当に直前のコマンドをそのままもう一度呼び出したい場合くらいでhそうか。

また、```Ctrl + a``` で入力中のコマンドの先頭へ、 ```Ctrl + e``` でコマンドの最後尾へカーソルを移動できます。　```Ctrl + d``` で現在カーソルが当たっている文字を消すというのもよく使います。

## パイプを積極的に使う

Linuxの最大の武器は ```|```（パイプ）によるコマンドの連結です。

例えば、「このディレクトリにある100個のファイルの中から、.bkがつくバックアップ用のファイルだけを選んで ```backup``` ディレクトリに移動したい」という作業を考えてみます。

WindowsやMacOSなどのGUIの場合、目視で.bkファイルを見つけたらカーソルをあててCtrlを押しながらクリックして、全部選べたらドラッグアンドドロップでbackupディレクトリに移動して、といった感じの作業になるかと思いますが、これではどこかで一つでもミスがあったら大幅に作業が戻ってしまう問題があります。

Linuxであれば、 「.bkファイルを```ls```で見つける」「```mv```で移動する」 といった２つのコマンドをパイプ（と ```xargs``` でつなげるだけで、簡単に、ミスなく目的を達成することができます。

実際のコマンドにすると、これだけです。
```
$ ls -1 *.bk | xargs -I{} mv {} tmp/
```

```*``` によるワイルドカード指定ができることもLinuxならではで、これによって100ファイルが1000ファイルになっても同じように作業できる、というのも作業を効率化できるポイントです。

うまく目的の作業を細かい単位に分解し、分解した操作にあたるコマンドを見つけて繋げていくことで、大抵の作業は１行で完結できてしまうところがLinuxの魅力です。

（2016/10/07 追記）
とても分かりづらいのですが、上記の```ls```コマンドのオプションは```-l```（ハイフンエル）ではなく```-1```（ハイフンいち）です。```-l```（ハイフンエル）の方はファイルの権限やオーナー等の詳細情報を1ファイル1行で出力するのに対し、```-1```（ハイフンいち）の方はファイル名のみを1ファイル1行で出力します。今回はファイル名をそのままパイプで```mv```に渡すため、余計な情報を出力しない```-1```（ハイフンいち）の方を使用しています。

## ブレース展開をうまく使う

「ブレース展開マジ便利！」という話ではないのですが、このようなちょっとした技を見かけたら、すぐに使ってみて、どんな時に使えるかを考えてみて、実際の作業で使ってみる、ということを繰り替えしていると、だんだんと自分の仕事内容に合った便利コマンドが増えていきます。今まで頑張ってコマンドをいくつも叩いていた作業が驚くほど簡略化されることもありますので、積極的に試してみてください。

ちなみに、ブレース展開については以下が参考になります。

[bashのブレース展開についてまとめ](http://qiita.com/ine1127/items/6e5fe80f4a9c64509558)

僕はこんな感じで使っています。

```
# ファイルのバックアップをとる （cp -p ./sometext.txt ./sometext.txt_20161006 と同じ）
$ cp -p ./sometext.txt{,_20161006} 

# diff を確認する　（diff ./sometext.txt ./sometext.txt_20161006 と同じ）
$ diff ./sometext.txt{,_20161006}
```

## まだ使ったことのないコマンドオプションを調べる

最初はコマンドとオプションを教わった通り、覚えた通りに使うことが多いと思います。しかし、それぞれのLinuxコマンドはよく調べてみるととても多くのオプションが用意されており、調べてみると「あ、こんなこともできたんだ！」「ってことはこうすればいつものあの作業が効率化できるな」といった発見があったりします。

ちなみに、上の方で使っている ```ls -1``` も、この記事を書きながら調べていたら見つけました。
「パイプで```mv```に渡すため、ディレクトリにあるファイルを１ファイル１行で出したい」というものなのですが、今までは

```
$ ls -l | grep -v total | awk '{print $9}'
```

とかってやっていました。（```ls -l``` で一覧を表示して、１行目に出力される 'total xx'の行を除外して、```awk``` でファイル名の部分だけ出力する）

タイプ量も減って、「total除かなきゃ」「ファイル名はスペースで区切って何番目だっけ？」みたいなことを考える必要もなくなって、今まで上記のコマンドを真面目に打っていたのがバカバカしく思えてきました。

## 先輩やネット上の先達がやっていることを真似してみる

Linuxの操作は引き出しが増えれば増えるほど作業を効率化できる世界です。

逆に言えば、引き出しがなくても時間をかけて地道にやれば目的を達成できる世界でもあります。そのため新しいやり方を吸収しようとしなければいつまでたっても「Linuxは扱いづらくて効率が悪い」という状態から抜け出せません。

先輩が操作している様子をよく観察したり、ネット上で披露される小技を真似してみたりすることで、「こんなやり方があるんだ！」をどんどん増やすことができ、Linux操作の上達につながるのではないかと思います。

# まとめ

僕も最初は ```cd``` コマンドひとつ打つにしてもおっかなびっくりで先輩にいちいち ```Enter``` して良いか確認していたものですが、6年ほど経って今ではやりたいこと次第ではGUIよりもターミナルを立ち上げてCUIで操作した方が楽だと思える程度にはLinux操作に慣れることができました。

先ほども述べた通り、Linuxは操作や考え方に慣れ、技を知れば知るほど作業効率を向上させることができるとても学ぶのが楽しい環境ですので、難しいからと敬遠せず積極的に使っていくことが大事です。

文字だけの世界と仲良くなって、ぜひ楽しいLinuxライフを！

---

続編として、[【Linux初級者向け】僕が本番作業で心がけていることを晒してみる](http://qiita.com/chooyan_eng/items/3934dc3747d6dba1b6cf)という記事も書いてみました。操作方法というよりは、仕事上で本番作業をする際の心得的な内容ですが、併せて読んでみていただければと思います。