1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-11-04

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

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

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

1.以下のコマンドを入力して、任意の場所にディレクトリを作成する
 # mkdir test

 ⇒ディレクトリが作成されたこと

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

 ⇒エラーとならないこと

3.以下のコマンドを入力して、ディレクトリ内部のファイル数を確認する
 # find ./ | wc -l

 ⇒項番2.で作成したファイル数が表示されること
unnamed (3).png

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

1.以下のコマンドを入力する
# find ./ -type f -delete

 ⇒エラーとならないこと

2.以下のコマンドを入力する
# ll

 ⇒合計 0となっていること
unnamed (4).png

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

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

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

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

◎手順

1.以下のコマンドを入力し、任意のディレクトリにファイルを作成する
 # touch file{A..D}.log

 ⇒ファイルが作成されたこと
unnamed.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

※ここでは説明の都合上、上記日付にしている

※この記事の作成日は2024/11/2

⇒タイムスタンプが変更されたこと
unnamed (1).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

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

まずは、以下のコマンドを入力してファイルを作成する
# touch file{A..Z}.log

⇒ファイルが作成されたこと
スクリーンショット 2024-11-10 081927.png

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

※ファイルが消せていることの証明のため、
 fileY.log、fileZ.logのタイムスタンプだけは変更しない

# touch --date="2023/11/1 23:00" file{A..X}.log

⇒fileY.log、fileZ.log以外のファイルのタイムスタンプが変更されたこと
スクリーンショット 2024-11-10 082140.png

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

※ここでは180日前を起点にそれより前のファイルを削除する

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

※-mtimeオプションで指定する際は、+Nであることに留意する

# find . -name \*.log -mtime +180 -delete

⇒fileY.log、fileZ.log以外のファイルが削除されたこと

スクリーンショット 2024-11-10 083011.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 
※!は終点

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

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

◆実務的な使い方

 まずは、対象のディレクトリ内に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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?