Linux Tips: findで見つけたファイルへのコマンド一括実行


ファイル検索コマンド 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)などのオプションと組み合わせるのも有効です。

  1. No comments yet.
(will not be published)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)