findでディレクトを抽出して所有者・パーミッション変更
目次
概要
ディレクトリの所有者やグループ、パーミッションをまとめて変更したいとき、 『chown -R postgres:postgres /tmp/logwatch』や 『chmod -R 700 /tmp/logwatch』のように実行します。 指定したディレクトリを再帰的に検索して所有者やパーミッションをまとめて 変更することができますが、この方法だとディレクトリだけでなく ファイルの所有者やパーミッションまで変更してしまいます。
ディレクトリだけの所有者やパーミッションを変更したい場合は、 find コマンドを使用し、ディレクトリだけを抽出した上で 所有者等の変更コマンドを実行させることで対応できます。
find コマンドの使用例も交えてやり方をご紹介します。
構成
サーバ構成
OSバージョン
Red Hat Enterprise Linux 5.9 x86_64
手順
指定したディレクトリ内に存在するディレクトリ、ファイルの表示
find コマンドのシンプルな使い方です。 以下の例では /tmp/logwatch/ ディレクトリ内にあるディレクトリやファイルを 検索してそれぞれフルパスで表示します。
# find /tmp/logwatch/ /tmp/logwatch/ /tmp/logwatch/conf /tmp/logwatch/conf/logfiles /tmp/logwatch/conf/logwatch.conf /tmp/logwatch/conf/override.conf /tmp/logwatch/conf/services /tmp/logwatch/conf/ignore.conf /tmp/logwatch/scripts /tmp/logwatch/scripts/logfiles /tmp/logwatch/scripts/services /tmp/logwatch/scripts/shared
指定したディレクトリ内に存在するディレクトリ、ファイルの詳細表示
上記ではディレクトリやファイルをフルパスで表示したのみでしたが、 次の例ではパーミッションや所有者、更新日付などの情報を付加して表示します。 find コマンドの -exec オプションに続けて、抽出した各行に対して実行したいコマンド (今回は ls -ld)を指定します。 最後の『{} \;』はおまじないと思っておいてください。
# find /tmp/logwatch/ -exec ls -ld {} \; drwxr-xr-x 4 root root 4096 7月 23 23:56 /tmp/logwatch/ drwxr-xr-x 4 root root 4096 7月 23 23:56 /tmp/logwatch/conf drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/conf/logfiles -rw-r--r-- 1 root root 103 7月 11 2012 /tmp/logwatch/conf/logwatch.conf -rw-r--r-- 1 root root 77 7月 11 2012 /tmp/logwatch/conf/override.conf drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/conf/services -rw-r--r-- 1 root root 81 7月 11 2012 /tmp/logwatch/conf/ignore.conf drwxr-xr-x 5 root root 4096 7月 23 23:56 /tmp/logwatch/scripts drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/logfiles drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/services drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/shared
指定したディレクトリ内に存在するディレクトリのみを表示
続いては find コマンドで指定したディレクトリ内のディレクトリのみを抽出します。 -type d オプションを付加することで、ファイルが除外されてディレクトリのみが表示されます。 なお、-type f オプションを付加すると、逆にファイルのみが表示されます。
# find /tmp/logwatch/ -type d /tmp/logwatch/ /tmp/logwatch/conf /tmp/logwatch/conf/logfiles /tmp/logwatch/conf/services /tmp/logwatch/scripts /tmp/logwatch/scripts/logfiles /tmp/logwatch/scripts/services /tmp/logwatch/scripts/shared
指定したディレクトリ内に存在するディレクトリのみを詳細表示
これまでの内容を踏まえて、/tmp/logwatch/ ディレクトリ内にあるディレクトリのみを 抽出して詳細表示するには以下のように実行します。
# find /tmp/logwatch/ -type d -exec ls -ld {} \; drwxr-xr-x 4 root root 4096 7月 23 23:56 /tmp/logwatch/ drwxr-xr-x 4 root root 4096 7月 23 23:56 /tmp/logwatch/conf drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/conf/logfiles drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/conf/services drwxr-xr-x 5 root root 4096 7月 23 23:56 /tmp/logwatch/scripts drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/logfiles drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/services drwxr-xr-x 2 root root 4096 7月 11 2012 /tmp/logwatch/scripts/shared
指定したディレクトリ内に存在するディレクトリの所有者変更
ここでようやく本題に入ります。 find コマンドで /tmp/logwatch/ ディレクトリ内に存在するディレクトリのみを抽出し、 -exec オプションを付加して所有者の変更コマンド(chown)を実行します。 なお、find コマンドで抽出した各行(各ディレクトリ)に対して、それぞれ -exec オプションで指定したコマンドが実行されますので、 chown コマンドに -R オプションは不要です。
# find /tmp/logwatch/ -type d -exec chown postgres:postgres {} \;
変更後の確認
確認のため、/tmp/logwatch/ ディレクトリ内のディレクトリ、ファイルを 詳細に表示してみると、ディレクトリの所有者のみが変更されていることが分かります。
# find /tmp/logwatch/ -exec ls -ld {} \; drwxr-xr-x 4 postgres postgres 4096 7月 23 23:56 /tmp/logwatch/ drwxr-xr-x 4 postgres postgres 4096 7月 23 23:56 /tmp/logwatch/conf drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/conf/logfiles -rw-r--r-- 1 root root 103 7月 11 2012 /tmp/logwatch/conf/logwatch.conf -rw-r--r-- 1 root root 77 7月 11 2012 /tmp/logwatch/conf/override.conf drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/conf/services -rw-r--r-- 1 root root 81 7月 11 2012 /tmp/logwatch/conf/ignore.conf drwxr-xr-x 5 postgres postgres 4096 7月 23 23:56 /tmp/logwatch/scripts drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/logfiles drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/services drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/shared
指定したディレクトリ内に存在するディレクトリのパーミッション変更
所有者の変更と同様にディレクトリのパーミッションを変更したい場合は 以下のように実行します。
# find /tmp/logwatch/ -type d -exec chmod 700 {} \;
指定したディレクトリ内に存在するファイルのみを削除
少し応用して、/tmp/logwatch/ ディレクトリ内に存在するファイルのみを 強制削除するには以下のように実行します。 続けて確認コマンドを実行していますが、ファイルがなくなっていることが分かります。
# find /tmp/logwatch/ -type f -exec rm -f {} \; # find /tmp/logwatch/ -exec ls -ld {} \; drwxr-xr-x 4 postgres postgres 4096 7月 23 23:56 /tmp/logwatch/ drwxr-xr-x 4 postgres postgres 4096 9月 13 02:14 /tmp/logwatch/conf drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/conf/logfiles drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/conf/services drwxr-xr-x 5 postgres postgres 4096 7月 23 23:56 /tmp/logwatch/scripts drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/logfiles drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/services drwxr-xr-x 2 postgres postgres 4096 7月 11 2012 /tmp/logwatch/scripts/shared