Linuxターミナルコマンド一覧（中級編）

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

自分のローカル環境のPCでの作業では、実際にGUIでグラフィカルにファイルやディレクトリをいじることができます。
しかし、sshでログインしているサーバーではそうはいかず、CLI（ターミナル）だけでファイルやディレクトリを編集しなければならないこともあります。
本記事では、サーバーで何かする際によく使うと思われるコマンドを紹介します。

# コマンド一覧

## cat コマンド
ファイルの中身を表示するコマンド。

```bash:ターミナル
cat test.html  #test.htmlの中身を表示する
cat -n test.html  #test.htmlの中身を行番号と一緒に表示する
```


## find コマンド:ターミナル
ファイルを検索するコマンド。
これはデフォルトで指定したファイル以下をすべて検索してくれます。
ファイルの読み込み権限がない場合は末尾に`permission denied`と表示されるので、これがでた場合には`sudo`をつけて実行しましょう。

```bash:ターミナル
find ディレクトリ 検索条件 アクション　　 #このような形になっています
```

### 検索条件
```bash:ターミナル
find ディレクトリ -name "文字列" アクション  #ディレクトリ以下から文字列にマッチするファイルを検索する
find ディレクトリ -name "文字列" アクション  #ディレクトリ以下から大文字、小文字を区別せずに文字列にマッチするフィイルを検索する
find ディレクトリ -type d  #ディレクトリを探し出す
find ディレクトリ -type f  #ファイルを探し出す
```


### アクション
```bash:ターミナル
find ディレクトリ 検索条件 -print  #検索ファイルを表示する
find ディレクトリ 検索条件 -ls  #検索ファイルを詳しく表示する）
```

### 実際に使ってみる
```bash:ターミナル
find . -type f -print  #カレントディレクトリ以下のファイルを全て表示する
find . -type d -print  #カレントディレクトリ以下のディレクトリをすべて表示する
find . −name "hoge" −print -type f  #カレントディレクトリ以下から、hogeという文字列が含まれるファイルを検索して表示する
```

## grep コマンド
ファイル内から指定した文字に一致する内容を含む行を検索する。

```bash:ターミナル
grep オプション 検索文字列 ディレクトリ名  #このような形になっています。
```

### オプション
```bash:ターミナル
grep -r  #指定したディレクトリ以下をたどって検索する
grep -i  #大文字小文字を区別せずに検索する
grep -l  #検索した文字列が含まれているファイル名のみを表示する
grep -n  #検索した文字列が書いてある行番号を表示する。-lオプションと併用することはできない
grep -e  #複数の検索条件を指定する
grep -v  #パターンに一致しない行を表示する
```

### 実際に使ってみる
```bash:ターミナル
grep "hoge" *.html  #拡張子がhtmlのファイルからhogeを検索
grep -n "hoge" text.html  #test.htmlよりhogeを検索して行番号をつけて行を表示する）
grep -ir "hoge" .  #カレントディレクトリ以下のすべてのファイルからhogeという文字列が含まれている行を表示する
```


## ps コマンド
起動しているプロセスを表示するコマンド。

```bash:ターミナル
ps aux  #起動しているすべてのプロセスを表示する
ps aux | grep hoge  #上記のgrepコマンドと組み合わせて、psコマンドで検索したプロセスでhogeという文字が含まれるプロセスだけを表示する
ps aux | grep hoge | grep -v grep  #上記のコマンドで、grepコマンド以外のプロセスでhogeが含まれるプロセスだけを表示する
ps --pid PID  #特定のPIDだけを表示する
```

詳しい使い方などは以下のqiita記事を参考にしてみてください。
[psコマンドまとめ](https://qiita.com/shell/items/68ed71a7f018e5688f73)


## killコマンド
プロセスを終了させるコマンド。

```bash:ターミナル
kill PID  #さきほど表示したpsコマンドで表示したプロセスを終了させる
kill -9 PID  #プロセスIDのプロセスの強制終了させる
```

## tail コマンド
ファイルの末尾を表示するコマンド。

```bash:ターミナル
tail -n 10 test.log  #test.logというファイルを末尾から10行目までを表示する
tail -f test.log  #test.logの内容を常に監視して表示を更新する
```

## chown コマンド
ディレクトリやファイルの所有権を変えるコマンド。

```bash:ターミナル
chown testuser /usr/local/var/test.html  #/usr/test.htmlのファイルの所有権をtestuserに変更する
chown -r testuser /usr/local/var  #/usr/local/var以下のファイルの所有権をすべてtestuserに変更する
```


## uname コマンド
システムの情報やバージョンなどを表示するコマンド。

```bash:ターミナル
uname -a  #システムのすべての情報やバージョンを表示する
uname -n  #ホスト名を表示する
uname -m  #PCの種類を出力する
uname -r  #OSのリリース番号を出力する
uname -s  #OSの名称を出力する
uname -v  #OSのバージョンを出力する
```

## ln コマンド
ファイルやディレクトリへのリンクファイルを作成する。

```bash:ターミナル
ln file-a file-b  #file-aのハードリンクfile-bを作成する
ln -s file-a file-b  #file-aのシンボリックリンクのfile-bを作成する
ln -f ~~~  #すでにリンクが張られているリンクを上書きする
ln -v ~~~  #リンク作成前にファイル名を表示する
```

### ハードリンク
あるファイルと全く同じ（別名だけどファイルの情報や中身まですべてが同じ）ファイルを別の場所に作ります。
参照元のファイルの情報（所有権でもファイルの中身でも）を変えたら、それに応じてリンクファイルの内容も変わり、その逆もまた同じことが起きます。

### シンボリックリンク
シンボリックリンクは参照元と参照先の区別がはっきり存在します。
シンボリックリンクは参照先が存在しなくてもエラーにはなりません。


## chown コマンド
そのファイルの所有権を決める

```bash:ターミナル
chown testuser test.html #test.htmlの所有者をtestuserに変更する
chown -R testuser test.html  #test.htmlのディレクトリ以下のすべてのファイルとディレクトリの所有者をtestuserに変更する
```


## chmod コマンド
そのファイルやディレクトリにに対して誰がどのような権限があるかを決める

```bash:ターミナル
chmod u+x test  #testファイルにユーザーの実行の権限を与える
chmod u-r /usr/local/test  #/usr/local/testファイルのユーザーの読み込み権限を取り去る
chmod -R g+w /usr/local  #/usr/local以下の全てのファイルに対してグループの書き込み権限を与える
chmod -R 755 test  #testディレクトリ以下のすべてのファイルとディレクトリにユーザーrwx/グループrx/その他rxの権限を与える
```


### 権限の見方

|表示|意味|
|:----------:|:------------:|
|-rw-r--r--|読み出し可能なファイル。所有者だけが書き込み可能|
|-rwx------|実行可能なファイル。所有者以外のアクセスはすべて不可|
|-rwxrwxrwx|すべてのユーザーが，すべての操作を行える|
|-rwxrwxr-x|所有者とグループ・ユーザーのみ書き込み可能|
|-rwsrwxr-x|ファイルを実行する際，所有者の権限で実行する|
|-rwxrwsr-x|ファイルを実行する際，グループの権限で実行する|
|-rwTrw-rw-|全てのユーザーがファイルの変更はできるが，削除やファイル名の変更は所有者のみが行えるファイル|
|drwxr-xr-x|ディレクトリ。他のユーザーは書き込み不可|
|drwx------|プライベートなディレクトリ|
|drwxrwxrwt|すべてのユーザーがディレクトリ内のファイルを作成・変更できるが，削除やファイル名変更は所有者のみが行えるディレクトリ|
|lrwxrwxrwx|シンボリック・リンク。パーミッションはリンク先のものを引き継ぐ|


|記号|意味|
|:----:|:----:|
|r|読み出し可能。マイナス(-)の場合は読み出し不可|
|w|書き込み可能。マイナス(-)の場合は書き込み不可|
|x|実行可能。マイナス(-)の場合は実行不可|
|t|ディレクトリへのスティッキ・ビット。所有者のみがディレクトリ内のファイル名の変更，削除を行える|
|T|ファイルへのスティッキ・ビット。所有者のみがファイル名の変更，削除を行える|
|s|セットID。その他のユーザーがファイルを実行する際，所有者またはグループの権限で実行する|

|権限|数字|
|:-:|:-:|
|rwx|7(=4+2+1)|
|rw-|6(=4+2)|
|r-x|5(=4+1)|
|-wx|3(=2+1)|
|r--|4|
|-w-|2|
|--x|1|
|---|0|