ファイル検索コマンド find を使って、マッチしたファイルやディレクトリに対して、一括して何かコマンドを実行したい場合、オプション(-exec)を使って、それを実現することができます。
以下は、一例ですが、CentOS-5.x(Linux)では、マニュアルの「EXAMPLES」セクションに様々な実行例が紹介されています。
特定パターンのファイルの行数を数える
ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に wc コマンドで行数をカウントします。
$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec wc -l {} \; 1643 /var/log/messages.2 368 /var/log/messages.1 2 /var/log/httpd/access_log 2882 /var/log/httpd/error_log
特定パターンのファイルについて、ファイルサイズを調べる
ファイル名の末尾が「log」または「1桁の数字」で終わるファイルを対象に du コマンドでサイズを表示します。
$ find /var/log/ -type f \( -name "*log" -or -name "*.[0-9]" \) -exec du -h {} \; 128K /var/log/messages.2 28K /var/log/messages.1 4.0K /var/log/httpd/access_log 344K /var/log/httpd/error_log
特定パターンのファイルを一括して圧縮
Linuxのログ世代管理ツール「logrotate」は、デフォルトでログを圧縮しない設定(nocompress)になっており、それを圧縮する設定(compress)に変えたいケースがあります。その場合、既存のログファイルを次のコマンドを使って一括して圧縮することができます。
該当ファイルの一覧表示。
$ find /var/log -type f -name "*.[0-9]" /var/log/messages.1 /var/log/messages.2 /var/log/httpd/access_log.1 /var/log/httpd/access_log.2 /var/log/httpd/error_log.1 /var/log/httpd/error_log.2
圧縮処理の実行。
$ find /var/log -type f -name "*.[0-9]" -exec gzip {} \;
実行結果の確認。
$ find /var/log -type f -name "*.gz" /var/log/messages.1.gz /var/log/messages.2.gz /var/log/httpd/access_log.1.gz /var/log/httpd/access_log.2.gz /var/log/httpd/error_log.1.gz /var/log/httpd/error_log.2.gz
ファイルの所有者を一括して rootに変更する
特定ユーザー(root)が所有していないファイルの所有者を一括で変更します。
該当ファイルの一覧表示。
$ find log/ ! -user root -name "*.[0-9]" -ls 2619934 332 -rw-rw-r-- 1 zabbix zabbix 333562 6月 1 04:02 log/zabbix/zabbix_agentd.log.1 2619915 20 -rw-r----- 1 nginx adm 18720 6月 7 04:02 log/nginx/access.log.2 2619919 4 -rw-r----- 1 nginx adm 264 6月 6 14:57 log/nginx/error.log.1 2619918 76 -rw-r----- 1 nginx adm 72575 6月 7 04:02 log/nginx/error.log.2 2619921 40 -rw-r----- 1 nginx adm 37950 6月 6 04:02 log/nginx/access.log.3 2619849 20 -rw-r----- 1 nginx adm 18853 6月 7 03:59 log/nginx/access.log.1
所有者の一括変更。
$ find log/ ! -user root -name "*.[0-9]" -exec chown root:root {} \;
実行結果の確認。
$ find log/zabbix log/nginx -name "*.[0-9]" -ls 2619934 332 -rw-rw-r-- 1 root root 333562 6月 1 04:02 log/zabbix/zabbix_agentd.log.1 2619915 20 -rw-r----- 1 root root 18720 6月 7 04:02 log/nginx/access.log.2 2619919 4 -rw-r----- 1 root root 264 6月 6 14:57 log/nginx/error.log.1 2619918 76 -rw-r----- 1 root root 72575 6月 7 04:02 log/nginx/error.log.2 2619921 40 -rw-r----- 1 root root 37950 6月 6 04:02 log/nginx/access.log.3 2619849 20 -rw-r----- 1 root root 18853 6月 7 03:59 log/nginx/access.log.1
特定パターンのファイルについて、パーミッションを一括変更する
パーミッションが 600 ではないファイルを一括して、パーミッションを 600 に一括変更します。
該当ファイルの一覧表示。
find ./log -type f ! -perm 600 -ls 2619933 28 -rw-r--r-- 1 root logcheck 26925 6月 6 22:46 ./log/messages 2619906 8 -rw-r--r-- 1 root logcheck 7393 6月 2 04:02 ./log/messages.1.gz 2619923 24 -rw-r--r-- 1 root root 22166 5月 27 19:39 ./log/messages.2.gz 2619914 8 -rw-r--r-- 1 nginx adm 6325 6月 7 11:59 ./log/nginx/access.log 2619917 4 -rw-r--r-- 1 nginx adm 231 6月 7 07:48 ./log/nginx/error.log
パーミッションの一括変更。
$ find ./log -type f ! -perm 600 -exec chmod 600 {} \;
実行結果の確認。
$ ls -l ./log/messages* ./log/nginx/* -rw------- 1 root logcheck 26925 6月 6 22:46 ./log/messages -rw------- 1 root logcheck 7393 6月 2 04:02 ./log/messages.1.gz -rw------- 1 root root 22166 5月 27 19:39 ./log/messages.2.gz -rw------- 1 nginx adm 6325 6月 7 11:59 ./log/nginx/access.log -rw------- 1 nginx adm 231 6月 7 07:48 ./log/nginx/error.log
このように find コマンドのオプション(-exec)を使うことで、効率的に処理を行うことができます。
検索したいディレクトリの階層数(-maxdepth)などのオプションと組み合わせるのも有効です。
最近のコメント