LinuxのTip集

## コマンド基本+α
### 省略しない名前
省略しない名前を知っているとちょっとした時に役に立つかも？

- cd : change directory
- pwd : print working directory
- mv : move
- cp : copy
- ls : list
- ln : link

### teeでリダイレクト
リダイレクトと言えば`>`であるがこれだと実行中の標準出力には何もでない。
teeコマンドを使うと標準出力に表示しつつ`tee hoge.log`でhoge.logにも書き込む[^tee]。
名前の由来は標準出力を受けて２つの出力先に分けるのがアルファベットのTに似ているから。
時間がかかって実行状況を見たい`make`などのコマンドに使うと便利

## 権限(Permission)について
`4:読み取り可`、`2:書き込み可`、`1:実行可`の合計値で表す。
基本のデフォルトはディレクトリは`755`、ファイルは`644`。
ディレクトリに実行権限(+x(1))がないとディレクトリ内で新しいファイルなどが作れない[^permit_dir]。
数字は順にユーザー、グループ、それ以外。グループとそれ以外に書き込み権限(+w(2))がないのは`umask`でマスクしているため[^umask]。

## bash起動時シェル
.bash_profileと.bashrcがある、ubuntuではさらに.bash_aliaseがある。(Ubuntuではシステムのユーザー用設定が.bashrcにあるためユーザーによる追加用に新たに作られたと思われる)
読み込み順は.bash_profile>.bashrc>.bash_aliase、

```bash:.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
```
のように記述されている(.bash_aliase)も同様。
`bash`を打つと`.bashrc`を起動することができる。

## よく使うオプションの意味
### -P: 物理的位置(`/`ルート)からの表示
```shell-session
$ pwd -P
```
シンボリックリンクを多用してる時に絶対位置が知りたい時に使う。
逆は`-L`:論理的位置をたどるだがデフォルトなので使わない。
他のコマンドでも使えるがあまり使う余地はないと思う。

### -r, --recursive
再帰的の意味でサブディレクトリを辿る。
### -f, --force
強制的の意味で一定のエラーなどを無視して進む。
パッケージ管理システム等で壊れた時に強制的に進めて(治す)ときなどに使う。
`rm -f`とするとパーミッションがなくても強制的にファイルを削除してしまう。

### -p, --preserve[=ATTR_LIST]
保存する、留めるの意味。`-a, --archive`=`dR`はサブディレクトリやリンクなどもすべてできる限りそのまま保存しようとする。
`-p`は所有者、パーミッション、タイムスタンプなどファイルの情報のみ保存する

### -v, --verbose
言葉が多い、冗長の意味。時間がかかるコマンドを流す時に状況を把握したい時に使うといい
`rsync`コマンドで容量が大きいファイルを流す時は`--progress`をつけると何%転送したかまで表示してくれる。

### -maxdepth N (find), --max-depth N (du)
`find`と`du`でオプションが違うので注意、最小値の`min~`もある。

```shell-session
$ find ./ -maxdepth N ${options}
$ du --max-depth N ./
```
## エイリアス(別名)
`aliases ${別名}="${本名}"`で登録可能、`unaliases ${別名}"で削除。
emacs`使いだと`aliases emacs="emacs -nw"`などと登録しておくと便利。
Ubuntuだと`ls`系コマンドは以下のエイリアスがあった(多分他でもある)。

```bash:ls_aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
```

## リソース管理系コマンド
### df : ディスクの空き容量を表示する
**パーティション**ごとの空き容量を表示する。ディレクトリごとはできない。
### du : ファイル(ディレクトリ)の使用量を表示する

### ps プロセス確認
`ps aux`とするとほぼすべてのプロセスとそれが使うリソースが得られる。
`a`:端末を持つ全てのプロセスを表示する。`x`:端末を持たない全てのプロセスを表示する。`u`:cpu、メモリの使用率などを追加する。である
その他にも`--sort`等のコマンドもある[^ps]

### top プロセスをリアルタイム表示
リアルタイムの表示なので端末を専有される、終了はq。詳しい使い方はこちら[^top]。
CPUやMENは使用率(%)で表示してくれる。

### vmstat[^vmstat]
IO、メモリ、CPUの状況など全体的な情報を得る`vmstat ${秒}`等で監視できる。
CPUは時間の割合らしい。

## findテクニック
### バックアップファイルの削除
emacsが自動保存する`#*#`、viの自動保存する`*.swp`、自動バックアップファイル`*~`等が作成される。これらをor`-o`で判定して-deleteで削除。
エイリアス`clean`等に登録しておくと便利かも

```bash:clean
find \( -name "#*#" -o -name "*~" -o -name "*.swp" \) -delete
```
### リンク切れファイル[^find_bad_link]
`find -xtype l`、`-delete`オブションをつけると削除できる。

### -execオプション
-execをつけると結果を次のコマンドに引き渡せる場所は`{}`で指定する。
コマンドの終了はセミコロンですがシェルに解釈されないようにエスケープをつけて`\;`になります。
プラス`+`にすると`{}`の場所にまとめて展開されます[^find+]。一回のコマンドで終わるので高速になりますが2つめの引数で意味が変わる場合`cp`などでは事故を起こす可能性があります。

```shell-session
$ find ./ -type f -exec chmod 644 {} \+
$ fine ./ -type d -exec chmod 755 {} \;
$ find ./ -name "*.txt" -exec cp {} \;
cp: './back_up/hoge.txt' と 'back_up/hoge.txt' は同じファイルです # findが複数回走るためコピーされたファイルも列挙される。
$ find ./ -maxdepth 1 -name "*.txt" -exec cp {} \; # -maxdepthでサブディレクトリは除外しているのでエラーはでない。
```
### 時間オプション

## Tipや罠
### unlinkはrmの別名[^unlink]
なので実体をしてしまうと実体から削除される。`rm`も`-r`を付けないとディレクトリは削除しない、ディレクトリのシンボリックリンクは削除しないのでほぼ同じ。

```bash:.bash_aliase
function unlink_aliase(){
    if [ -L $1 ]; then
        unlink $1
    else
        echo "$1はシンボリックリンクではありません"
    fi
}

alias unlink="unlink_aliase"
```
このように別名コマンドを作ってそれをエイリアスで上書き登録することで実体ファイルの削除は防げる。

### パーティションの作成や変更
root権限が必要でファイルシステムに直接手を入れるのでデータ破損リスクはかなり高い。
`fdisk`を使うがコマンドラインで使いづらい[^fdisk]。GUIだとGParted[^GParted]がよく使われる。１，２回やったことがあるけれどもいずれもGPartedを使った。

### extundelete: 最終手段[^extundelete]
Ubuntuだと`apt`に存在する。あくまでも最終手段、IOが多いとファイルシステム自体から消えて手遅れになるよう。

[^tee]: [teeとリダイレクト](https://qiita.com/matyapiro31/items/6ba3d1d431d8df3788a5)
[^permit_dir]: [実行権限のみ欠けたディレクトリ(rw-)の挙動](実行権限のみ欠けたディレクトリ(rw-)の挙動)
[^umask]: [Linuxのファイル権限でつかうumask値のuってなんだろね?](https://qiita.com/papapa_paper/items/5af5d53a02190f37bf82)
[^ps]: [【 ps 】コマンド――実行中のプロセスを一覧表示する](http://www.atmarkit.co.jp/ait/articles/1603/28/news022.html)
[^top]: [topコマンドの使い方](https://qiita.com/k0kubun/items/7368c323d90f24a00c2f)
[^vmstat]: [vmstat](https://qiita.com/ryotaro76/items/4e273be640d2716a7b91)

[^find_bad_link]: [リンク切れのシンボリックリンクを探す方法](https://qiita.com/kawaz/items/ba0e75b6828bd3951e52)

[^unlink]: [unlinkはリンクを削除するだけのコマンドではない](https://qiita.com/Kyou13/items/4a6742bf1cf260d96b29)

[^fdisk]: [fdiskでDisk容量を拡張する](https://qiita.com/2or3/items/501f206a6091a4ce895f)
[^GParted]: [GPartedでパーティションを操作するには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/825usegparted.html)
[^extundelete]: [Linuxにて削除(rm)してしまったファイルを復元する【CentOS】](https://qiita.com/satoken0417/items/c1535b7d3322ac0d69ca)

[^find+]: [find の -exec optionの末尾につく \; と + の違い。](https://qiita.com/ironsand/items/0aed2ffca295706cab69)