CHMOD-ファイルとディレクトリに異なるアクセス許可を適用する


9

私はいくつかのボックスのアクセス許可を整理しようと試みており、運が悪ければchmod manとすべてのインターネットドキュメントを精査してきました。

基本的に、私は多くのサブディレクトリとファイルを含むディレクトリを持っています-そして、私は以下の許可を設定したいと思います:

ディレクトリの場合:770(u + rwx、g + rwx、o-rwx)

ファイルの場合:660(U + rw、g + rw、ax、o-rw)

可能であれば、これを単一の再帰的なchmodで試してみたいと思います-各ディレクトリを再帰してファイルごとのアクセス許可を設定することを避けるためです。

私自身のシェルスクリプトを記述せずにこれを行う方法があるはずだと思いますが、何も見つけることができませんでした。

私はあなたの助けに感謝します!

回答:


10

ファイルとディレクトリの両方のアクセス許可を1度に変更すると便利で、リンクされていることが多いため、スクリプトは便利だと思います。ファイルサーバー上の共有ディレクトリの場合は770と660、Webサーバーディレクトリの場合は755/644などです。そのタイプのサーバーで最もよく使用されるモードのスクリプトをルートのbin /に保持し、一般的な場合は手動で検索しますモードは適用されません。

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac

うわー!これはまさに私が探していたものです。どうもありがとうございました!
Skone、2010年

iPauloさん、「$ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;」という行の「$ ii」について説明できますか。「$ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;を検索する」だけではない理由が理解できません。ありがとう!
Skone、2010年

20

スクリプトは必要ありません。

//ディレクトリ:

find . -type d -exec chmod XXX {} \;

//ファイル:

find . -type f -exec chmod XXX {} \;

17

あなたの場合、他の人がそれを作成したほど複雑にする必要はないかもしれません(find確かに、この種のことを行うには一般的に優れたツールです)。モード間の違いは実行ビットです。実行ビットが設定されているファイルがない場合は、chmod要求したとおりに、を1回呼び出すだけで実行できます。

chmod -R u=rwX,g=rwX,o= FILE...

ここで重要なのは大文字ですX。これは、manページで次のように説明されています

実行/検索は、ファイルがディレクトリであるか、一部のユーザーに対してすでに実行権限を持っている場合に限ります。

したがって、ファイルにまだ実行ビットが設定されていない場合は、ディレクトリにのみ設定されます。


これはすばらしいことですが、777を書くよりもはるかに長くなります。-Xの省略形はありますか?
エリオットB

6

少なくとも私の使用例でrsyncは、ディレクトリをそれ自体にコピーするのに使用chmodすると、からのファイルのリストを直接使用するよりもはるかに高速であることがわかりましたfind

rsync -rpt --chmod=D770,F660 . .

chown同じ操作にaを追加rsyncする場合は、--chown=user:groupオプションを使用してこれを行うこともできます。


おっと、これは実際にはchmod -Rよりもはるかに高速です。
Epeli

chmodよりもはるかに高速です。この方法でrsyncを使用することの欠点はありますか?私はそれをたくさんやってきました、そしてすべてがうまくいくようです。
ナマケモノ

1

クリーンでシンプル:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)

非常にエレガントなアプローチ。
user5336

3
おそらく、ただし、これはファイルにスペースがない場合にのみ機能することに注意してください。より「安全な」アプローチはfind ... -exec chmod ... {} \;
isaaclw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.