ターミナルで使うUNIXコマンド

#はじめに
ターミナルでコマンドを使えるととても便利なので、まとめてみました。
ちなみにGUIの対称としてCUIと呼ばれたりしますが、CLIというのが正しいらしいです。

#コマンドの前にショートカット

ctrl+dで終了
ctrl+cで処理停止
ctrl+zで一時停止
- $ fgで再開
- $ jobsで止まっている処理が確認できる
⌘+nで新規画面
⌘+wで画面削除
⌘+tでタブ追加


このあたりがよく使うとこでしょうか。

#最低限に覚えた方がいいやつ

現在地の取得

```terminal
$ pwd
```

ディレクトリの移動

```terminal
$ cd　#単独で使うとhomeまで戻る
$ cd ~ #homeまで戻る
$ cd ~/ディレクトリ　　#home以下のディレクトリに移動する
$ cd ディレクトリ名　#指定したディレクトリに移動する
$ cd .. #一つ上の階層に戻る
```

リストセグメント
ディレクトリ確認　単にlsだけでも大丈夫です。

```terminal
$ ls /
```
１列で表示。−aをつけることで隠しファイルも全て表示できます。

```terminal
$ ls -1 /
$ ls -1 -a /
```

以下では指定したディレクトリの中身を１列で列挙できます。

```terminal
$ls -1 -R ディレクトリ名
```

-lをつけることでディレクトリにあるものの情報を表示してくれます。
permission・中のリンクの数・所有者・所有G・バイト単位のデータサイズ・最終更新日時・名前など。

```terminal
$ls -l　ディレクトリにあるものの情報を表示してくれる
```


困ったらマニュアルを起動(qで終了)

```terminal
$ man ls
```
画面が汚くなってきたら

```terminal
$ clear
```

過去に使ったコマンドをみるには

```terminal
$ history
```
ctrl+Rで過去のコマンドを検索しながら再実行もできます。

```terminal
$ history
```

#知っておいた方がいいやつ

ディレクトリの作成

```terminal
$ mkdir ディレクトリ名
```

複数階層でディレクトリを作成する		

```terminal
$mkdir -p first/second 
```
		
ファイルの作成

```terminal
$ touch filename.拡張子
```

ファイルの削除

```terminal
$ rm filename.拡張子
```

ディレクトリの削除

```terminal
$ rm -r ディレクトリ名
```
ディレクトリの中にファイルが複数あるときには警告が出るので、その時は以下で削除できる

```terminal
$ rm -r -f ディクレトリ名 
$ rm -rf ディレクトリ名
``` 

ファイルに書き込み

```terminal
$ echo hogehoge > ファイル名
```

ファイルのコピー(同じディレクトリ内)

```terminal
$ cp hoge.txt hoge_copy.txt
```

ファイルのコピー(違うディレクトリ)　

```terminal
$ cp hoge_copy.txt copy先ディレクトリ/hoge_copy2.txt
```

ディレクトリのコピー

```terminal
$ cp -R ディレクトリ１ ディレクトリ_copy
```
ファイル名の変更

```terminal
$ mv filename.txt filename2.txt
```

ファイルの検索

```terminal
$ find . -name "*hoge*"
#(ピリオドは現在のディレクトリからの意味)
```
タイプで検索　dはディレクトリの意味  ２階層深くの意味

```
$ find . -type d   -maxdepth 2
```     

ファイル内検索

```terminal
#複数ファイルも可能
$ grep 検索文字列 ファイル名 ファイル名 ファイル名

#文字列数をカウント
$ grep 検索文字列 -c ファイル名 ファイル名 ファイル名
```

lsと組み合わせて、文字列検索をすることもできます。

```terminal
$ ls |　grep 文字列
$ ls | grep Desktop
```


#知ってたら便利なワイルドカード

検索したい文字列の前後で使える`Wildcard`
*の部分には0個以上の文字列が入ります。

```terminal
$ ls hoge.txt*
$ ls hoge.*
$ ls *.txt*
$ ls *.txt
$ ls *.*  
``` 

検索したい文字列の前後で使える`Wildcard?`
?の部分には**1個以上**の文字列が入ります。

```terminal
$ ls *.tx?
$ ls *.txt?  #これはダメ
```

#知ってたら便利なファイル閲覧コマンド

ファイルの閲覧cat。ターミナル上にそのまま表示します。

```terminal
$ cat ファイル名 
```

ファイルの閲覧less。別で立ち上げを行います。
（/で文字検索、jkで上下移動、udでスクロールができる、qで終了）

```terminal
$ less ファイル名　
```

ファイルの閲覧more。
lessと見た目は一緒だが、一番下まで行くと元のターミナルに戻ります。

```terminal
$ more ファイル名
```

ファイルの閲覧head。
最初の１０行を表示します。また-nによって何行取得かも指定できます。
※tailも当然あります

```terminal
$ head ファイル名　
```
```terminal
$ head -n3 ファイル名
```

#(個人的には)あまり使うことないやつ


コマンドで誰がどこまで操作できるかPermissionを確認できます。

```terminal
$ ls　-l
```

１列目はファイルの種類で

```
d:ディレクトリ
-:ファイル
```

を表しています。他にもたくさん種類ありますが、使いそうなのだけ。


それ以降は３列ずつに分かれていて

```
234列目：ユーザーの権限u
567行目：グループの権限g
それ以降は：その他の権限o
```

となっていて、それぞれ

```terminal
r:読み取り
w：書き出し
x:実行
-:権限なし
```
という風になっています。

```terminal
chmod　①②③　ファイル名
```

によって権限の変更は可能です
①は誰についてなのかu(ユーザー)/g（グループ）/o(その他)/a(全て）
②は権限について　＋（付与）　ー（剥奪）　＝（変更）
③はどの権限かについて。上記でかいたように書き出しなどです。


例えば以下のコマンドで、個人ユーザーから読み取りの権限を剥奪できます。

```terminal
chmod u-r testfile
chmod u-r,g-r,o-r testfile
```

#これは便利！リダイレクト！

入出力の方法を変えることをリダイレクトと呼びます。

例えば、処理結果の出力先(1)をターミナルからファイルへの書き込みに変更したり，入力元(0)をキーボードからファイル読み出しに変更したりすることです。

たとえばechoを使うと直接書き込むことができます。　


```terminal
echo　書き込むこと　> ファイル名 #上書き
echo　書き込むこと　> ファイル名　#追記
```
これで日付を書き込むことができます。

```terminal
date　>　ファイル名
```
また他のデータから出力したものをファイルに書き込むこともできます。

```terminal
$ head -n1 hoge.txt > hoge2.txt
```
また　2>　とすることでエラー出力されます。

```terminal
$ echo abc 2> hoge3.txt
```
また以下のようにすることでエラーを別で出力できます。

```terminal
$ echo hoge > hoge1.txt 2> hoge3.txt
```
ファイルをまとめることもできる。

```terminal
$ cat hoge1.txt hoge2.txt > new.txt
``` 
計算式を入れて、出力することができる

```terminal
$ echo 1+5 > hoge4.txt
$ bc < hoge4.txt
6
```
計算式を入れて出力し、それを再度

```terminal
$ echo 1+5 > hoge4.txt
$ bc < hoge4.txt > hoge5.txt
```

特定の文字が入力されるまで、ファイルに書き込み続ける

```terminal
cat << EOF >ファイル名
```

Teeを使うことで>をしたうえでcatまでしてくれる

```terminal
$ date | tee ファイル名
$ cal | tee ファイル名
``` 


#（個人的には）1年に数回しか使わないやつ

```terminal
$ ps # process status
```
プロセスID/端末/CPU時間/実行コマンドを表しています。

```terminal
$ ps -f
```
ユーザーID/プロセスID/親プロセスID/CPU使用率/開始時間/端末/CPU時間/実行コマンドを表します。

他のアカウントについても表示

```terminal
$ ps -fa
```
全部のプロセスを表示できる

```terminal
$ ￼ps -fe
```

```terminal
$ top
```

を使うとリアルタイムでプロセスをみることができます。

#vim使うことだけ

起動します。

```terminal
$ vim ファイル名
```
ファイル名が存在しない時は新規ファイルが作成されます。

###ノーマルモード

ノーマルモードで使うコマンド。

|コマンド|覚え方|動作|
|:-:|:-:|:-:|
|a|append|カーソルのある文字の後ろで挿入モード|
|i|insert|カーソルのある文字の前で挿入モード|
|o,O|open lines|新しい行を下に作って(オープンして)挿入モード|
|O|open lines|新しい行を上に作って(オープンして)挿入モード|
|w|word|次のワードに移動|
|e|end of word|一番近くにある(次の)単語の最後部に移動|
|b|backword|一番近くに(前の)単語の最前部に移動|
|u|undo|実行した動作の取り消し|
|ctrl+f|forword|前進する(下に進む) スクロール|
|crtl+b|back||後退する(上に戻る) スクロール|
|ctrl e| |一行づつ前進する(下に進む) スクロール|
|ctrl y| |一行づつ後退する(上に進む) スクロール|
|gg|gogo|先頭に戻る(頭に数字をつけると、数字の行に移動)|
|yyp| |カーソルのある行をコピー|
|dd|delete|カーソルのある行を削除|
|ctrl+v|Visual mode|矩形選択できる($を押せば複数行選択できる。ypでコピペできる)|
|^(shiftは押さない)| |行頭に移動|
|〜(shift+^)| |大文字/小文字に変更|
|$| |行末に移動|
|H|High|スクリーンの上部に移動|
|M|Middle|スクリーンの中央部に移動|
|L|Low|スクリーンの下部に移動|
|ctrl+p| |補完| 
###コマンドモード

```vim
:e ファイル名   #ファイルを開ける
:q     #終了
:q!    #強制終了
:w     #上書き保存
:wq    #保存して終了
:tabnew   #タブの作成
:! unixコマンド　　　#UNIXコマンドへの一時的な切り替え
```

これらの:が下に付いている状態をコマンドモードといいます。
/を使うことで、検索をすることが可能です。nによって次の位置に移ることができます。
コマンドモードから抜けるときは**esc**を押します。


###インサートモード

iを押して、下にINSERTが付いたら、それはインサートモードです。
編集が出来るようになります。
※aやoでもできます。開始の仕方が異なります。大文字もあります。


移動に関しては

```
h:左
j:上
k:下
l:右
```

で移動ができ
また数字＋(hljk)で移動することも複数一気に移動することが可能です。



#参考
[面白いUnixコマンド集めてみた](http://vdeep.net/funny-unix-command)
[仕事の役には立たない、Linuxにおけるジョークプログラムの話](https://qiita.com/Hiroki_lzh/items/8cf206d54f91e29b3912)
[Macのsayコマンドの使い方](https://qiita.com/zakuroishikuro/items/0c17acb21f119647c205)￼