OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

findでディレクトを抽出して所有者・パーミッション変更

カテゴリ:OSSセットアップ | ソフトウェア:Linux | タグ:
最終更新日:2021/01/04 | 公開日:2013/09/13

目次

概要

 ディレクトリの所有者やグループ、パーミッションをまとめて変更したいとき、 『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