【Linux】findコマンド周り(-mtime,-delete,-newermt)

# ▼findコマンドを使用してファイル数確認

ディレクトリ内部のログファイルが膨大すぎて、ls -lコマンドが機能しないときに、ディレクトリ内部のログファイル数を確認する場合に有効。

実際の現場では、百数十万のログファイルがディレクトリの中にあったりする。


##### 1．以下のコマンドを入力して、任意の場所にディレクトリを作成する
```　
　# mkdir test
```
　⇒ディレクトリが作成されたこと

##### 2．以下のコマンドを入力して、項番1．で作成したディレクトリ内部にファイルを10000個作成する
```
　# touch　file{1..10000}.log
```
　⇒エラーとならないこと

##### 3．以下のコマンドを入力して、ディレクトリ内部のファイル数を確認する
```
　# find ./ | wc -l
```
　⇒項番2．で作成したファイル数が表示されること
![unnamed (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/267e812a-d305-77b6-1e5b-e2875a0138a6.png)



# ▼findコマンドを使用してファイル削除

##### 1．以下のコマンドを入力する
```
# find ./ -type f -delete
```
　⇒エラーとならないこと

##### 2．以下のコマンドを入力する
```
# ll
```
　⇒合計　0となっていること
![unnamed (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/e791c57d-a99e-f412-f52e-e3b2e2d8cd71.png)



# ▼findコマンドを使用してn日前から現在のファイルを削除する

◎流れ
　1．ファイルを4つほど作る

　2．ファイルの日付を変更する

　3．findコマンドで削除する
　　<font color="blue">※今回はn日前を起点にしてそこから現在までに該当するものを削除する
  　　そのため、-mtimeオプションは-Nで指定する</font>

◎手順
##### 1．以下のコマンドを入力し、任意のディレクトリにファイルを作成する
```
 # touch file{A..D}.log
```
　⇒ファイルが作成されたこと
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/dce2fd3e-0896-0cb8-9dc5-e1bb215b7833.png)


##### 2．以下のコマンドを入力して、項番1．で作成したファイルのタイムスタンプを変更する
```
# touch --date="2024/7/1 23:00" fileA.log
```
```
# touch --date="2024/8/1 23:00" fileB.log　　
```
```
# touch --date="2024/9/1 23:00" fileC.log
```
```
# touch --date="2024/10/1 23:00" fileD.log
```
<font color="blue">※ここでは説明の都合上、上記日付にしている</front>

<font color="blue">※この記事の作成日は2024/11/2</front>

 ⇒タイムスタンプが変更されたこと
![unnamed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/68f6f0b5-bddf-f02b-45d9-16926a23fe9c.png)


##### 3－1．以下のコマンドを入力して、40日前から現在のファイル、つまりfileDを削除する
```
# find . -mtime -40 -delete 
```
##### 3－2．以下のコマンドを入力して、70日前から現在のファイル、つまりfileCを削除する
```
# find . -mtime -70 -delete 
```
##### 3－3．以下のコマンドを入力して、100日前から現在のファイル、つまりfileBを削除する
```
# find . -mtime -100 -delete
```
##### 3－4．以下のコマンドを入力して、130日前から現在のファイル、つまりfileAを削除する
```
# find . -mtime -130 -delete 
```
　⇒ファイルが削除された事

 ![unnamed (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/49779821-3758-3398-c0fd-059594c34f01.png)




# ▼findコマンドを使用して過去～n日前のファイルを削除する


##### まずは、以下のコマンドを入力してファイルを作成する
```
# touch file{A..Z}.log
```
⇒ファイルが作成されたこと
![スクリーンショット 2024-11-10 081927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/3d72b116-381d-3fde-1f4b-6afac4d5cf89.png)




##### 次に、以下のコマンドを入力してタイムスタンプを変更する

<font color="blue">※ファイルが消せていることの証明のため、
　fileY.log、fileZ.logのタイムスタンプだけは変更しない</front>

```
# touch --date="2023/11/1 23:00" file{A..X}.log
```
⇒fileY.log、fileZ.log以外のファイルのタイムスタンプが変更されたこと
![スクリーンショット 2024-11-10 082140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/04d29fb7-dd5a-4b7a-8231-e583ee0e4a84.png)


##### 最後に、以下のコマンドを入力してファイルを削除する

<font color="blue">※ここでは180日前を起点にそれより前のファイルを削除する</front>

<font color="blue">※-nameオプションでワイルドカードを指定するときは、バックスラッシュをつける必要がある</front>

<font color="blue">※-mtimeオプションで指定する際は、+Nであることに留意する</front>
```
# find . -name \*.log -mtime +180 -delete
```
⇒fileY.log、fileZ.log以外のファイルが削除されたこと

![スクリーンショット 2024-11-10 083011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761139/6eaa90cf-bf89-5d17-c14f-4807a16cf06e.png)


# ▼findコマンドを使用して-newermtで期間指定検索

 
  ディレクトリ内部のファイル数が膨大過ぎて、llコマンドでファイル数を確認できない場合、ファイルがどの期間にどれぐらいあるのかを調べる際に役に立つ。

　パイプでwc -lに出力すると、指定した期間に含まれるファイル数を確認することができる。
 
  　今回は、説明のため、ディレクトリ内部のファイルのタイムスタンプが分かっていることを前提で話を進めている。

ディレクトリ内部に以下のファイルが入っているとする。
```
ls -l --time-style=+'%Y-%m-%d %H:%M:%S'
-rw-r--r-- 1 root root 0 2024-07-01 23:00:00 fileA.log
-rw-r--r-- 1 root root 0 2024-08-01 23:00:00 fileB.log
-rw-r--r-- 1 root root 0 2024-09-01 23:00:00 fileC.log
-rw-r--r-- 1 root root 0 2024-10-01 23:00:00 fileD.log
```


例えば、2024/04/01(23:00)〜2024/12/01(23:00)に含まれるファイル数を確認したいとき。
以下のコマンドを実行する。
```
find . -type f -newermt "20240401 2200" ! -newermt "20241201 2330" | wc -l
4 
```

<font color="blue">
※！は終点

※時分指定する際は、日付との間にスペースを空ける。

※上記(↑)コマンドは、あくまで一例なので、他の時分指定をしてもOK。
</font>

### ◆実務的な使い方

　まずは、対象のディレクトリ内にcdで移動する。次に、以下のコマンドを入力して、更新日時が一番古いファイルを1件だけ表示する。
```
　ls -ltr | tail -n +2 | head -1
-rw-r--r-- 1 root root 0  7月  1  2023 fileA.log
 ```

　で、例えば、ディレクトリ内の一番古いファイルのタイムスタンプが2023年7月と判明して、2023年7月を起点に2023年12月30日までの期間にどれぐらいファイルが存在するだろうって場合に便利。
```
find . -type f -newermt "20230701" ! -newermt "20241230" | wc -l
4
```
　逆も然りで、以下のコマンドを入力して、更新日時が一番新しいファイルを1件だけ表示する。

 
```
ls -ltr | tail -1
-rw-r--r-- 1 root root 0 10月  1 23:00 fileF
``` 

で、例えば、ディレクトリ内の一番新しいファイルのタイムスタンプが2024年10月と判明して、2024年10月を起点に過去2024年3月30日までの期間にどれぐらいファイルが存在するだろうって場合に便利。
```
find . -type f -newermt "20240303" ! -newermt "20241002" | wc -l
4
```