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

作成日: 2013/09/13

Linuxサーバ管理

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

トップページLinuxサーバ管理 > 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

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会

■■■ 当サイトは Internet Explorer 11 と Mozilla Firefox 43 で動作確認済みです。 ■■■