ファイルを探したい(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)ローテーションと
呼ぶそうです。