まぁまぁよく使うLinuxコマンド集

# はじめに

この記事ではよく使うLinuxコマンドについておさらいしていく記事です。
主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば書き直していく予定です。

※実務であれこれと Linux 系 OS に触っていますが
コマンドや基礎について振り返ると新しく気づきがあったり良いなと思うこの頃

## ファイル・ディレクトリの操作と管理

### pwd

カレントディレクトリを表示する。超基本

```bash
# カレントディレクトリを表示する
$ pwd

# これでも同じ結果が表示される
$ echo `pwd`

```

バッククウォートを使うことで
echo に埋め込まれたコマンドを実行することができる。

※echo コマンドとは指定された文字列を標準出力に渡すコマンド
よくリダイレクトともに使ったりする。

### cd

カレントディレクトリを変更する。
何も指定しない場合はホームディレクトリに移動

```bash

# ホームディレクトリに移動
$ cd

# testディレクトリを作成
mkdir test

# testディレクトリに移動
cd test

```

### ls

カレントディレクトリのファイル及びフォルダを表示する。
引数にディレクトリを指定するとそのディレクトリ内の一覧を表示できる。

```bash
# カレントディレクトリのファイル及びフォルダの一覧を表示する
$ ls

# testディレクトリを作成
$ mkdir test

# testディレクトリの中身を全て表示する
$ ls test

```

また、ファイルのアクセス権やタイムスタンプを表示する場合は-l オプションを用いる。
隠しファイルを表示する場合は-a オプションを用いる。

```bash

# アクセス権およびタイムスタンプを表示する
$ ls -l

# 隠しファイルを表示する
$ ls -a

```

実務で使うとき

```bash
# 隠しファイルも含めてアクセス権タイムスタンプ付きで表示する
$ ls -la
```

### cp

ファイルのコピー・移動・削除・タイムスタンプの変更
ファイルをコピーする。-p オプションを指定しない場合はタイムスタンプを更新する。

```bash
# ファイルをコピーする
$ cp file1.txt file2.txt

# タイムスタンプをそのままにする
$ cp -p file1.txt file2.txt
```

### mv

ファイルを移動する。移動先の名前を移動前のファイル名と違う名前にすることで
ファイル名を変更できる。
また、移動先の名前が移動元と同じ名前にする場合にするときは
移動先のファイル名を省略できる。

```bash
# ファイルを一つ上のディレクトリに移動

$ mv file1.txt ../

# ファイル名を変更する(別のファイル名として移動する)
$ mv file1.txt file2.txt
```

### rm

ファイルおよびフォルダを削除する。
フォルダを削除する場合は-r または-R オプションをつける。
※削除すると元に戻すことができないので扱いに注意が必要

```bash
# 特定のファイルを削除する
$ rm file.txt

# ディレクトリを削除する
$ rm -r folder

# 削除の確認をせず削除
rm -f file.txt

```

### touch

しばしば、ファイルを作成するコマンドとして勘違いされますが
ファイルのタイムスタンプを変更するコマンドです。
※ファイルの指定がない場合はファイルを新規で作成する。

```bash

# ファイルが存在しない場合は新しく作る
touch test

# ファイルが存在する場合で-tオプションがない時は指定されたファイルのタイムスタンプを現在時刻に変更
touch test

# -t でタイムスタンプを変更 形式：yyyymmddhhmmss
touch -t 202109041500 test

```

改めて touch コマンドの仕様を見ると怖いなと思うこの頃
というのも
ファイルが新規作成されたときと
そうでない時の動きが実際に使ってみると同じようにしか見えないので
知らず知らずのうちに既存のファイルのタイムスタンプを変更しかねない。

### file

ファイルの種別を表示する。
それがバイナリなのかテキストなのか
テキストなら文字コードは何かまで表示してくれる。
ディレクトリであればディレクトリであることを教えてくれる。
※ちなみにディレクトリである場合、最近の OS は色を変えてハイライト表示してくれる。

```bash

# ホストファイルの属性を調べる
$ file /etc/hosts

# bashプログラムの属性を調べる
$ file /bin/bash

```

### rmdir

空のディレクトリを削除するコマンド
ディレクトリ内にファイルが入っている場合は削除は実行されない。
-p オプションを使うことで複数階層にまたがってディレクトリを削除する。

```bash

# 空のディレクトリ test を削除する。
$ rmdir test

$ rmdir -p ./test/aaa

```

## メタキャラクタの利用

メタキャラクタとはファイル名のパターンを表す記号のような物です。
例えば、100 個のテキストファイルを連番で作成するとき
メタキャラクタという機能を使わない場合は 100 回の touch コマンドを実行しなければなりません。
また、ファイルを検索するときにあいまいに検索したいなどの用途にもメタキャラクタは利用できます。
覚えておくとコマンドを使い倒せるので覚えておきましょう。

アスタリスク
0 文字以上の文字列にマッチする。
test\*であれは
test から続く文字列にマッチする。

```bash
# testから始まるファイル名またはディレクトリ名にマッチする
$ ls -la test*
```

ブラケット
指定された文字列内にあるいずれかの文字にマッチする。

```bash
# []に列挙されている文字のいずれかにマッチする
$ ls -la a[bc]]

# abかacにマッチする。abcにはマッチしない

```

クエスチョンマーク
任意の 1 文字にマッチする。

```bash
# testで始まるファイルを連番で作成
$ touch test{1..10}

# test10にはマッチしない
$ ls test?
```

カーリーブラケット
カンマで区切られた文字列にマッチする。

```bash
# testで始まるファイルを連番で作成
$ touch test{1..10}

# test10にはマッチしない
$ ls test{1,2,3}
# test1,test2,test3 にマッチする。

```

### 圧縮・解凍

```bash
# 1から10000の数値を入してファイルを作成
$ echo {1..10000} > test

# 元のファイルを削除せずにgz形式に圧縮
gzip -c test > test.gz

# 元のファイルを削除しつつ圧縮する場合
$ gzip test

$ mkdir compress

$ touch ./compress/test{1..100}

# coompress ディレクトリ内のファイルを個別に圧縮する
# 圧縮元ファイルは削除する
$ gzip -r ./compress

# compressディレクトリ配下のファイルをひとつのzipにまとめる
$ gzip  -c ./compress/* > sample.gz

```

## テキスト処理と標準入出力

### cat

指定されたファイルの内容を表示する。
※バイナリファイルも指定可
いろんなコマンドとつないで使うことが多いコマンド(後述)

```bash
# ファイル名 test の内容を表示する
$ cat test
```

標準入力と END を利用すると複数行のテキストを入力することができる。

```bash
# 次のENDが入力されるまで入力を受け付ける
$ cat << END > test
```

### リダイレクト

不等号の記号を使うことで決まった文字列を入力できる。

不等号1回で新規作成してテキストを出力、不等号2回で既存のファイルへの追記となる。※なければ新規に作成して出力

```bash
$ echo "test" >> test.txt
```

### パイプライン処理(パイプ)

コマンドの出力結果を他のコマンドに渡すようにする仕組みのことである。

以下のコマンドを実行するとファイルの中身をgrepで検索してくれる。

```bash
cat test.txt | grep "test"
```

もちろん、パイプライン処理と組み合わせることも可能である。

```bash
cat test.txt | grep "test"　 > sample_grep.txt
```

## まとめ

今回は非常に簡単なコマンドをいくつかおさらいしました。
クラウドになっても仮想マシンの運用やdockerコンテナの作成でLinux系のコマンドを打つことがありますので
覚えておくと良いかもしれません。

## おわり