Linuxでファイル操作(解凍、圧縮、アーカイブ作成、プロセス、ファイル検索)

# gzipコマンド
gzipコマンドを使うとファイルを圧縮したり圧縮前のファイルに戻したり(展開、解凍)できます。

```
$ gzip
```

# gzipコマンドのオプション
以下のオプションもgzipコマンドを使う時に使います。
上のコマンドだけだとファイル作成後の元のファイルが削除されてしまいます。

|オプション|意味|
|--|--|
|-c|標準出力へ出力|
|-d|圧縮ファイルを展開|
|-k|圧縮、解凍後に元ファイルを削除しない|
|-r|ディレクトリ内のファイルを全て圧縮する|

使い方はオプションの後にファイル名をつけます。



-cの使い方をみてみます。
```
$ gzip -c test.txt > test.txt.gz
```
test.txt.gzを残したままファイルを圧縮し標準出力をします。

# gzip以外のコマンド
```bzip2```コマンドも使えます。ファイルの末尾が```.bz2```になります。
```xzコマンド```もありあます。

```
$ bzip2 test.txt
bzip2: Input file test.txt is a directory.
```
***ディレクトリを.bzにすることはできません***でした。

```
% xz test.txt
xz: test.txt: Is a directory, skipping
```
***ファイルでは圧縮することはできました。***


# 解凍のやり方

|ファイル種類|コマンド|
|--|--|
|.gz|gunzip|
|.bz2|bunzip2|
|.xz|unxz|

-dも入れると解凍できます。

# アーカイブ作成
```アーカイブ```とは***複数のファイルを1つのアーカイブファイルにまとめる***ことです。

アーカイブファイルでは```tarコマンド```を使います。

|オプション|意味|
|--|--|
|-c|アーカイブ作成|
|-f|アーカイブファイル名指定|
|-r|アーカイブにファイル追加|
|-t|アーカイブの中身を確認|
|-x|アーカイブからファイルを取り出す|
|-z|gzipによる圧縮、展開をする|
|-j|bzip２ファイルを扱う|
|-v|詳細を表示|



-は省略できるみたいです。

# アーカイブの操作をしてみる
上の表をベースに実際に動かしていきます。

Animalディレクトリを見ながらやっていきます。
```
Animal % ls       #一覧表示
cat	dog	monkey
Animal %tar -cf animal.tar cat dog monkey  　　　# -cfでanimal.tarのアーカイブファイルを作成し、 cat dog monkey をまとめる
Animal % ls
animal.tar	cat		dog		monkey
Animal % tar -tf animal.tar  　　　#-tfでanimal.tarのアーカイブの中身を表示
cat
dog
monkey
```

次はアーカイブの中身を取り出してみます。

```
Animal % tar -xf animal.tar
Animal % ls
animal.tar	cat		dog		monkey
```
次にファイルを作成して圧縮します。

```
Animal % tar -czf animal.tar.gz cat dog monkey  #-cfzでファイルを作成し、圧縮展開
Animal % ls
animal.tar	animal.tar.gz	cat		dog		monkey
```
animal.tar.gzの中を見てみます。

```
Animal % ls
animal.tar.gz
Animal % gunzip animal.tar.gz
Animal % ls
animal.tar
hashimotonoriaki@MacBook-Pro-3 Animal % tar -tf animal.tar
cat
dog
monkey
```
これでファイルを作成して圧縮することができました。
次にアーカイブファイルの中身を確認していきます。
```
Animal % tar -czf Zoo.tar.gz dog monkey gorillas
Animal % ls					
Zoo.tar.gz	dog	 monkey	 gorillas	
Animal % tar xvzf Zoo.tar.gz
x dog
x monkey
x gorillas/
```

```
Animal % ls
dog		gorillas  monkey  elephant	
Animal % tar cf Zoo.tar dog monkey gorillas
Animal % ls
dog		gorillas 	monkey	elephant  Zoo.tar	
Animal % tar rf Zoo.tar elephant 　　 #elephantを追加
hashimotonoriaki@MacBook-Pro-3 Animal % ls
dog			gorillas	monkey	 elephant		
Zoo.tar		
```	




# cpioコマンド
３つのモードがあります。

⚫︎コピーアウトモード
⚫︎インサートモード
⚫︎コピーパスモード

```
Animal % ls > dog        
Animal % vi dog
Animal % cpio -o < dog  > dog.cpio
2 blocks
Animal % ls
dog		dog.cpio	monkey		practice.txt	xaa
Animal % ls -l
total 32
-rw-r--r--  1 taro  staff    28  7  4 16:27 dog
-rw-r--r--  1 taro  staff  1024  7  4 16:28 dog.cpio
-rw-r--r--  1 taro  staff    28  7  1 15:02 monkey
drwxr-xr-x  4 taro  staff   128  6 28 17:54 practice.txt
-rw-r--r--  1 taro  staff    49  6 30 13:26 xaa
Animal % ls | cpio -o > monkey.cpio
cpio: monkey.cpio: Can't add archive to itself
4 blocks
hashimotonoriaki@MacBook-Pro-3 Animal % ls -l
total 40
-rw-r--r--  1 taro  staff    28  7  4 16:27 dog
-rw-r--r--  1 taro   staff  1024  7  4 16:28 dog.cpio
-rw-r--r--  1 taro   staff    28  7  1 15:02 monkey
-rw-r--r--  1 taro  staff  2048  7  4 16:33 monkey.cpio
drwxr-xr-x  4 taro   staff   128  6 28 17:54 practice.txt
-rw-r--r--  1 taro   staff    49  6 30 13:26 xaa

```

```
Animal % mkdir copyto
Animal % ls       
copyto		gorillas	monkey.cpio	xaa
dog		monkey		practice.txt
Animal % ls -l
total 32
drwxr-xr-x  2 taro staff    64  7  4 16:47 copyto
-rw-r--r--  1 taro staff  1024  7  4 16:28 dog
drwxr-xr-x  2 taro staff    64  7  4 16:35 gorillas
-rw-r--r--  1 taro staff    28  7  1 15:02 monkey
-rw-r--r--  1 taro staff  2048  7  4 16:33 monkey.cpio
drwxr-xr-x  4 taro staff   128  6 28 17:54 practice.txt
-rw-r--r--  1 taro staff    49  6 30 13:26 xaa
Animal % cpio -pd copyto < monkey      
3 blocks
```

# メタキャラクタ
***文字の代わりとなる記号***です。


|メタキャラクタ|説明|
|--|--|
|*|0文字以上の文字または文字列にマッチする。【例】「a*」であれば「a」「ab」「abc」「aaaa」のいずれもマッチする。0文字もマッチすることに注意。|
|?|任意の1文字にマッチする。【例】「a?」であれば「aa」「ab」「a1」などはマッチし、「a」「abc」などにはマッチしない。|
|[]|[]内に列挙されている文字のいずれか1文字にマッチする。連続した文字列には「-」が使用できる。[a-z]は英小文字すべて、[0-9]は数字すべて、指定範囲の先頭に「!」を使うとマッチしない範囲を指定できる。【例】「a[bcd]」は「ab」「ac」「ad」のいずれかにマッチする。「a[!bcd]」は「aa」「a1」はマッチするが、「ab」「ac」「ad」にはマッチしない。|	
|{}|{}内の文字を使って文字列を生成する。【例】「test{1,2}」はtest1、test2を生成する。|	

>引用　https://tech.pjin.jp/blog/2021/01/31/linux-metacharacter	


# findコマンド
***アクセス権のあるディレクトリ内やファイルを検索***します。
書き方は
```
$ find ディレクトリ名　検索式
```
```-name　ファイル名```のようなファイル名検索などがあります。-type　ファイルの種類、-user　ユーザー名　などもあります。
-execコマンド{}\;のようなマッチしたコマンドを実行するものもあります。

```
taro% ls -l ./Animal/
total 16
-rw-r--r--  1 taro  staff   7  6 28 10:54 dog
-rw-r--r--  1 taro  staff   7  6 28 10:55 monkey
drwxr-xr-x  2 taro  staff  64  6 28 13:20 practice.txt
taro % find ./Animal -name dog  #findコマンドでAnimalの中のdogを探す
./Animal/dog
```


# locateコマンドとupdatedbコマンド
```locateコマンド```はあらかじめ作成された***ファイル名データベースの中からファイルを検索***します。
```updatedbコマンド```でデータベースを作成更新しておく必要があります。

```
$ updatedb  #データベース更新

$ locate 
```

この記事に細かい使い方が載っています。

https://qiita.com/a05kk/items/ccdd408512944cb55821


# which、whereis、typeコマンド
```which```は***絶対パスを表示するコマンド***です。
```whereis```は***指定したコマンドのオプションで指定したファイルの場所を検索***します。
```type```はどんなコマンドなのか表示します。




# ディレクトリの構造
ディレクトリは木みたいな構造になっています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/8a2012b8-66ab-d0ea-ff11-ef4181386bac.png)

>引用　　https://gicp.co.jp/manegementnote/directory-structure/


この記事に細かいディレクトリの説明があります。

https://qiita.com/nys9302/items/a8ddeedd3cd9d0deb332

# プロセス
```プロセスとはLinuxで実行中のプログラム```のことです。
他にも```マルチタスク```という***複数のプロセスを同時に稼働できるシステム***です。

### プロセスの確認
|コマンド|オプション|意味|
|--|--|--|
|ps|a|全てのプロセス表示|
|ps|f|親子関係をツリー表示|
|ps|u|ユーザー名表示|
|ps|x|制御していないデーモンなどのサービス表示|
|ps|-e|全てのプロセス表示|
|ps|-f|詳細情報(完全なflオーマット)表示|
|ps|-l|詳細情報表示|
|ps|top|稼働プログラムを監視|
|ps|pgrep|特定のPIDを調べたい時|
|ps|pstree|親子関係を階層構造で表示|

またtopコマンドでは稼働状況を見る時だけは```uptime```コマンドを使いQで終了します。
pgrepコマンドに-lをつけるとPIDに加えプロセス名を表示します。

⚫︎補足
```
$ ps ax
$ ps -ef
```


デーモンも含めてプロセスを表示します。

### psコマンドで表示されるもの
psコマンドを実行すると以下のようになります。

```
taro@MacBook-Pro-3 ~ % ps a
  PID   TT  STAT      TIME COMMAND
30775 s000  Ss     0:00.16 login -pf taro
30776 s000  S      0:00.17 -zsh
35446 s000  R+     0:00.02 ps a
 1078 s005  Ss+    0:00.08 /usr/local/bin/zsh -l
```

|PID|プロセスID|
|--|--|
|TTY|端末の名前|
|STAT|プロセスの状態|
|TIME|実行された時間|
|COMMAND|実行名|


# プロセス終了コマンド
***killコマンド***を使います。
こちらの記事を読んでみてください。

https://eng-entrance.com/linux-command-kill

他にも```killall```コマンドと```pkill```コマンドがあります。


|killall|入力された名前と一致するプロセスを終了|
|--|--|
|pkill|プロセス名を指定し、言葉が含まれる全てのプロセスを終了します。|

```-Uならユーザー名、-Gならグループ名を指定```します。

それぞれの使い方です。
```
taro@MacBook-Pro-3 ~ % sleep 100000 &
[1] 35511
taro@MacBook-Pro-3 ~ % sleep 200000 &
[2] 35512
taro@MacBook-Pro-3 ~ % ps a 
  PID   TT  STAT      TIME COMMAND
30775 s000  Ss     0:00.16 login -pf taro
30776 s000  S      0:00.20 -zsh
35511 s000  SN     0:00.00 sleep 100000
35512 s000  SN     0:00.00 sleep 200000
35516 s000  R+     0:00.00 ps a
1078 s005  Ss+    0:00.08 /usr/local/bin/zsh -l
taro@MacBook-Pro-3 ~ % killall sleep
[2]  + terminated  sleep 200000
[1]  + terminated  sleep 100000
```

```
taro@MacBook-Pro-3 ~ % sleep 100000 &  
[1] 35524
taro@MacBook-Pro-3 ~ % sleep 200000 &
[2] 35526
taro@MacBook-Pro-3 ~ % ps a          
  PID   TT  STAT      TIME COMMAND
30775 s000  Ss     0:00.16 login -pf taro
30776 s000  S      0:00.22 -zsh
35524 s000  SN     0:00.00 sleep 100000
35526 s000  SN     0:00.00 sleep 200000
35527 s000  R+     0:00.01 ps a
 1078 s005  Ss+    0:00.08 /usr/local/bin/zsh -l
taro@MacBook-Pro-3 ~ % pkill slee
[2]  + terminated  sleep 200000
[1]  + terminated  sleep 100000
```

⚫︎sleepとは
指定された秒だけPCのプロセスの動作を止めます。

http://x68000.q-e-d.net/~68user/unix/pickup?sleep#:~:text=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%20sleep%20%E6%8C%87%E5%AE%9A%E7%A7%92%E6%95%B0,%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AB%E4%BD%BF%E3%81%86%E3%80%82

# ジョブ
ジョブとはユーザーがコンピューターに実行させる処理のかたまりです。

### フォアグラウンドジョブとバックグラウンドジョブ
***フォアグラウンドジョブ***では***ジョブが終了するまで作業ができません***。
***バックグラウンドジョブ***ではジョブが裏側で実行され、ジョブが終了しなくても入力できます。

#### バックグラウンドジョブで実行する
コマンドラインの最後に```&```をつけます。

```
$ sleep 120 &
```
これで２分間実行されます。
下は２０秒で設定しました。

```
taro@MacBook-Pro-3 ~ % sleep 20 &
[1] 35672
taro@MacBook-Pro-3 ~ % ps
  PID TTY           TIME CMD
30776 ttys000    0:00.24 -zsh
35672 ttys000    0:00.01 sleep 20
 1078 ttys005    0:00.08 /usr/local/bin/zsh -l
taro@MacBook-Pro-3 ~ % cal
      6月 2022         
日 月 火 水 木 金 土  
          1  2  3  4  
 5  6  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30        
```

# ブートプロセス(systemd)
Linuxが起動づるまでの流れ(ブートプロセス)についてです。

ざっくりですが
電源が入る　⏩　BIOS(UEFI)が起動　　　⏩　　Linuxが起動(カーネル、initあるいはsystemd)　　⏩　　操作可能　　

```systemd```がLinuxの起動処理やシステム管理をする仕組みです。initよりも高速で、
```cgroups```でプロセスのリソースを管理します。

```Unit```とはsystemdで扱われる処理の単位です。

unitの種類が載ってました。

https://www.kabegiwablog.com/entry/2018/06/11/100000

特に ```〜.target``` と```〜.service```がよく使われます。

```ターゲット```は***複数のUnitをまとめたもの***です。

よく使われるターゲットは下の3つみたいです。

・```runlevel3.target```はほとんどのプロセスが動作します。

・```multi-user.target```　はCUIログインをします。

・```graphical.target　```　はグラフィカルなログインをします。


### ターゲット管理
現在のデフォルト設定を調べる
```
$ systemctl get-default　ターゲット名
```
デフォルトターゲット変更
```
# systemctl set-default　ターゲット名
```
ターゲットを実行
```
$ systemctl isolate　ターゲット名
```

この辺の記事も参考にしてみてください。

https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9

# 資料

https://www.udemy.com/course/linuc-lv1-101/