(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2018年5月12日土曜日

【Linux CentOS 6】指定したディレクトリ以下のファイルやディレクトリに対してまとめて処理を行う方法(たとえばパーミッション変更)


指定したディレクトリ(/DATA)以下にある全てのディレクトリのパーミッションを変更

# date ; IFS_orginal=$IFS ; IFS=$'\n' ; for i in `find /DATA -type d` ; do chmod 775 "$i" ; done ; IFS=$IFS_orginal ; date


指定したディレクトリ(/DATA)以下にある全てのファイルのパーミッションを変更

# date ; IFS_orginal=$IFS ; IFS=$'\n' ; for i in `find /DATA -type f` ; do chmod 664 "$i" ; done ; IFS=$IFS_orginal ; date



処理の最初と最後に、dateコマンドを実行することによって、処理にかかった時間がわかるようにしている。

find /DATA -type は、 処理結果を用いる必要があるのでバッククォートで括ること。


(区切り文字に注意)
$IFS は、区切り文字を指定する。
区切り文字がデフォルトの空白の場合、下記に挙げる処理において、
ディレクトリやファイル名に空白が存在すると、その箇所で分断され、不適切な処理となる。
for i in `find /DATA -type d`
上記の変数iには、パスが分断された不適切な値が渡されて、続くchmodで、エラーとなる。

そのため、次のようにして、区切り文字を空白でなく、改行に変更する。

IFS_orginal=$IFS で、現在の区切り文字を保存する。
IFS=$'\n' で、区切り文字を改行に変更する。
IFS=$IFS_orginal で、区切り文字を元に戻す。

すると、パス全体が適切に変数iに渡され、続くchmodに正しくパスが渡される。
(続くchomodの段階では、"$i" のように、ダブルクォーテーションで括ることも忘れないこと。)


<参考>
・【Linux CentOS 6 bash】 変数の前方後方パターンマッチによる部分消去方法、複数行ファイルのforループによる処理方法について【シェルスクリプト】
< http://akira-arets.blogspot.jp/2015/04/forrowsintexttodo-patternmatchonvar.html > 2018年5月12日

・【Linux CentOS5】ディレクトリ階層に分けて置かれた複数のファイルを条件指定で抽出し、別のディレクトリにまとめてコピーする【xargsと、cpコマンドの組み合わせ】
< http://akira-arets.blogspot.jp/2011/07/linuxxargscp.html > 2018年5月12日