find コマンドはファイル、ディレクトリを探すときによく使う定番のコマンド。よく使うのがfind で探したファイルに対して何か処理を発行するという使い方が定番。例えば、古いファイルを検索して検索したついでにファイルを削除してしまうなどがよくある利用方法だと思う。
よく使う使用例
ファイル検索
ファイル検索の基本形 find [対象ディレクトリ] ファイル名
test という文字列を含むファイルを検索する。ワイルドカードや正規表現を使う場合は -name オプションでファイル名を指定する。
# find . -name "*test*"
/var/tmp ディレクトリ配下の test という文字列を含むファイルを検索する。
# find /var/tmp -name "*test*"
カレントディレクトリの7日前以前に作成されたファイルを検索
find . -mtime +7
検索したファイルを操作
find で検索したファイルに対して何等かのコマンドを発行して処理を加える。
6日経過したファイルを削除する。
# find . -mtime +6 -exec rm -f {} \;
{}にfind で見つかったファイルが入る。-exec のあとに任意のコマンドを書いて、検索結果のファイルパスが入ってほしい場所に {} と書いて、最後に \; と書く。
2024年3月1日 12時以降に作成されたファイルを削除する。ファイルのみなので -type f をオプションで指定している。
# find . -type f -newermt '20240301 12:00' -exec rm -f {} \;
2024年2月27日 12時 ~ 2024年3月1日 10時 までの間に作成されたファイルを削除する。
# find . -type f -newermt '20240227 12:00' ! -newermt '20240301 10:00' -exec rm -f {} \;
ファイル操作の注意点
-exec のあとに任意のコマンドを書いて、検索結果のファイルパスが入ってほしい場所に {} と書いて、最後に \; と書く。こうすると rm -f test.txt みたいなコマンドがファイルの数だけ実行される。
ただ、この方法だとファイルの数だけコマンドが起動してしまうので、実行する内容によっては効率が悪い。rmコマンドのように複数のファイル名をパラメータで渡せばまとめて処理してくれるコマンドも多いので、そういうコマンドを使う場合は、最後に + と書く。
find . -mtime +6 -exec rm -rf {} +
おまけ
文字化けしたファイルの名前変更にもfindが便利。文字化けしたファイルのinode番号を調べて、inode番号をfindで検索した上でmvコマンドにて名前を変更する。
# ls -i
101636491 ?V?F??
# find -inum 101636491 -exec mv {} newnamefile \:
# ls
newnamefile
コメント