ディレクトリではなく、ファイルのアクセス権を再帰的に変更しますか?


13

UNIXシステムに移行したいくつかのファイルのアクセス許可を大量に再帰的に変更していました。それらをug + rwに変更しましたが、サブディレクトリを横断できないことがわかりました。私はマニュアルページを見て、chmodディレクトリを除外することについて何の説明も見なかったので、私は少しグーグルで調べ、人々findがディレクトリのパーミッションを再帰的にユーザーとグループの「実行」するように変更していたことがわかりました。私はそれをしてから、それらを調べることができました。

しかしchmod、ファイルを読み取り/書き込みに再帰的に変更し、ディレクトリをトラバースできないようにするには、この検索を実行できる必要があるように思えました。これを「正しい」方法で行ったか、それとももっと簡単な方法がありますか?

回答:


12

より良い解決策は

chmod -R ug=rwX,o=rX /path

大文字のX意味:実行ビットを設定する場合

ファイルがディレクトリであるか、すでに一部のユーザーの実行権限があります

chmodマニュアルページから引用)。

または、使用したい場合 find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)

USBハードドライブには、このコマンドのすべてのユーザー向けのバージョンを広く使用しました。chmod-v -R ugo = rwX / pathありがとう!
男14

明らかに使用しない方法はありませんfind700に600のすべてのファイルのアクセス権とすべてのディレクトリのパーミッションを設定するためには、(私は、件名に私のgooglingsてここに到着しました。)それは場合にすることができ、単一で行われるchmod -Rコマンド、私を修正して自由に感じます。
ワイルドカード

@Wildcard:正確ではありませんが、コマンドchmod -R u=rwX,go= /pathはほとんどあなたが望むことをします:実行ビットがすでに設定されているかどうかに応じて、すべてのディレクトリを700に設定し、すべてのファイルを600または700に設定します。これは正しいことだと思います。
-enzotib

1
@enzotib、はい-ほとんど、しかし完全ではありません。私の場合、スクリプトかバイナリかに関係なく、すべてのファイル(もちろんディレクトリではありません)の実行ビットを無効にます。したがって、作成したfindコマンドはテンプレートとして非常に役立ちました。:)
ワイルドカード

@Wildcardでは、最初に実行ビットを再帰的に削除してから、上記のコマンドを使用してディレクトリにのみ追加しますか?
マイケル

3

findを使用することは「正しい」方法であり、プログラムによる唯一の方法ですが、バリエーションもあります。

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

または

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

または最も遅い:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

これらはそれぞれファイル(ディレクトリではなく、シンボリックリンク)を選択し、そのファイルにchmodコマンドを適用します。最初の2つchmodは、最大値(多くの場合10)に達するまで毎回内部コマンドラインの最後にファイルを追加することにより、呼び出し回数を減らし、コマンドを呼び出して新しいコマンドの再構築を開始します。最後のステートメントは、ファイルごとに新しいプロセスを生成するため、効率が低下します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.