ファイルを探したい(find

$ find 検索パス 検索パターン

ファイルやディレクトリを探すコマンドです。 検索パス名の末尾の/ (trailing-slash)はつけなくて大丈夫です。 ファイルの内容は検索できません。

オプション

// ファイル名で検索(大文字/小文字を区別する)
$ find -name パターン

// ファイル名で検索(大文字/小文字を区別しない)
$ find -iname パターン

// 完全な正規表現を使うことができる
$ find -regex 正規表現

// 一致した完全パス名を書きだす
$ find -print

// ファイル容量で検索
$ find -size // ファイルの種類で検索
$ find -type タイプ

// 数分以内に変更されたファイルを検索
$ find -cmin // 数時間以内に変更されたファイルを検索
$ find -ctime // 検索結果を ls -l に書きだす
$ find -ls

findはUnix初期からあるコマンドのひとつです。 そのため、最近のコマンドオプションのような -ショートオプション--ロングオプションのような区別がありません。

ファイルの種類で探したい(-type

// ファイルを探したい
$ find 検索パス -type f

// ディレクトリを探したい
$ find 検索パス -type d

// シンボリックリンクを探したい
$ find 検索パス -type l

// 空のディレクトリを探したい
$ find 検索パス -type d -empty

-typeオプションでファイル(f)やディレクトリ(d)を指定できます。 -emptyオプションと組み合わせて、空のファイル、空のディレクトリを検索できます。

拡張子で探したい(-name

// HTMLファイルを探したい
$ find 検索パス -name "*.html"

// ZIPファイルを探したい
$ find 検索パス -name "*.zip"

// HTML以外のファイルを探したい
$ find 検索パス ! -name "*.html"

-nameオプションでファイル名のパターンを指定して検索できます。 後方一致を使うと拡張子で検索できます。 NOT検索する場合は!を使います。

タイムスタンプで探したい(-ctime / -mtime / -atime

// 作成日が7日以上前
$ find 検索パス -ctime 7d

// 最終更新日が1か月以内
$ find 検索パス -mtime -4w

// 10分以上前 - 60分以内に変更したファイルを探したい
$ find 検索パス -mmin +10 -mmin -60

-ctime系のオプションで、ファイルのタイムスタンプを使って検索できます。

  • -ctime(作成日)

  • -mtime(最終更新日)

  • -atime(最終アクセス日)

基準は現在時刻で、 -NはN日以内+NはN日以上前にマッチします。

サイズで探したい(-size

// 100kB以上のファイルを探したい
$ find 検索パス -size +100k

// 10MB以上のファイルを探したい
$ find 検索パス -size +10M

// 10MB - 50MBのファイルを探したい
$ find 検索パス -size +10M -size -50M

-sizeオプションでファイルサイズを基準に検索できます。 -サイズサイズ以下+サイズサイズ以上にマッチします。 重たいファイルの削除を検討したい場合に重宝します。

深さを指定したい(-depth

// 2階層目まで探したい
$ find 検索パス -depth 2 -name "*.html"

// 4階層目まで探したい
$ find 検索パス -d 4 -name "*.html"

グループ名で探したい(-group

$ find 検索パス -group グループ名

所有者不明のファイルを探したい(-nouser

# 所有者不明のHTMLファイルを探したい
$ find 検索パス -type f -nouser -name "*.html"

# グループ不明のHTMLファイルを探したい
$ find 検索パス -type f -nogroup -name "*.html"

空のディレクトリを削除したい(-empty -delete

$ find 検索パス -type d -empty -delete

-emptyオプションを使って、空のディレクトリが検索できます。 -deleteオプションを追加して、一括削除できます。

xargsしたい

$ find 検索パス 検索パターン -print0 | xargs -0 コマンド
$ find 検索パス 検索パターン -X | xargs コマンド

-print0もしくは-Xオプションで、安全な検索結果をxargsに渡すことができます。

GFSローテーションしたい

 1#!/bin/bash
 2
 3# 日次:毎日;7回分を保存
 4# 週次:毎週日曜日;4回分を保存
 5
 6SOURCE_DIR="バックアップしたいディレクトリ"
 7BACKUP_DIR="バックアップを保存するディレクトリ"
 8
 9# バックアップ日時:ファイル名に追加
10DATE=$(date +%Y%m%d)
11
12# 日次バックアップ
13tar zcvf ${BACKUP_DIR}/daily/${DATE}_backup_daily.tar.gz ${SOURCE_DIR}
14find ${BACKUP_DIR}/daily/ -type f -mtime +7 -print0 | xargs -0 rm
15
16# 週次バックアップ
17if [[ $(date +%u) -eq 7 ]]; then
18    tar zcvf ${BACKUP_DIR}/weekly/${DATE}_backup_weekly.tar.gz ${SOURCE_DIR}
19    find ${BACKUP_DIR}/weekly/ -type f -mtime +28 -print0 | xargs -0 rm
20fi

-mtimeオプションを活用すると 日次・週次・月次バックアップを取得するときにローテーションが組めます。 このようなローテーションを GFS(Grandfather-Father-Son)ローテーションと 呼ぶそうです。