対象ディレクトリーから特定のファイルを検索するには、findコマンドを使います。
ディレクトリー名やファイル名は、*(アスタリスク)や?(クエスチョンマーク)のようなワイルドカードや正規表現が使えます。
ただし、読み込み権限がないディレクトリーの配下は、エラーメッセージが出力されて検索できません。
findコマンドの基本的な使い方
findコマンドのもっとも基本的な使い方は、以下のようになります。
find ディレクトリー名 -name ファイル名
以下の例は、/usr/binディレクトリーからawkを検索します。
実行例
$ find /usr/bin -name awk
/usr/bin/awk
上記の例ではフルパス名しか表示されていませんが、ファイルの詳細情報も表示する場合は、xargsコマンドを併用します。
実行例
$ find /usr/bin -name awk | xargs ls -l
lrwxrwxrwx. 1 root root 4 Aug 12 2018 /usr/bin/awk -> gawk
更新日時が古いファイルを検索する
findコマンドは更新日時が何日以上前という条件でファイルを検索することができます。
これはログローテーション処理などで良く使います。
-typeオプションは「f」の場合はファイル、「d」の場合はディレクトリーを検索します。
-mtimeオプションは最終更新日が数x24時間以前のファイルを検索します。
日数の前の+(プラス)は以前を表します。なお、-(マイナス)と書くと以内を表します。
find ディレクトリー名 -type f -mtime +日数
以下の例は、/var/logディレクトリー配下で、更新日が60日以前のファイルを検索します。
実行例
$ find /var/log -type f -mtime +60 | xargs ls -l
-rw-------. 1 root root 31528 Jun 19 2019 /var/log/anaconda/anaconda.log
-rw-------. 1 root root 3502 Jun 19 2019 /var/log/anaconda/dbus.log
-rw-------. 1 root root 595405 Jun 19 2019 /var/log/anaconda/dnf.librepo.log
(以下略)
また、検索した古いファイルをそのまま削除する場合は、以下のようにします。
find ディレクトリー名 -type f -mtime +日数 -delete
様々な検索
findコマンドは様々なオプションをつけて検索することができます。
以下の例は、/var/logディレクトリー配下で拡張子が.log以外、更新日が60日以前、サイズが1000バイト以上のファイルを検索します。
メモ
ディレクトリーに実行ユーザーの読み込み権限がないとエラーメッセージを出力してしまうので、findコマンドの最後に「2> /dev/null」を書いてエラーメッセージを抑止しています。
実行例
$ find /var/log ! -name *.log -mtime +60 -size +1000c -type f 2> /dev/null | xargs ls -l
-rw-------. 1 root root 239799 Jun 19 2019 /var/log/anaconda/syslog
-rw-r--r--. 1 root root 1040 Nov 5 18:36 /var/log/README