私は、UNIXシステムに移行したいくつかのファイルのアクセス権を大量に再帰的に変更していました。それらをug + rwに変更しましたが、サブディレクトリをトラバースできないことがわかりました。私はchmod
のmanページを見て、ディレクトリを除外するための説明を何も見なかったので、少しグーグルすると、人々がfind
を使用してディレクトリの権限を再帰的に「実行」に変更することがわかりました'ユーザーとグループ。私はそれをしましたそしてそれから私はそれらを調査することができました。
しかし、私はこれをchmod
で実行できるようにすべきだと思いました-再帰的にファイルを読み取り/書き込みに変更しますが、ディレクトリを通過できないようにします。これを「正しい」方法で行ったか、それを行う簡単な方法はありますか?
より良い解決策は
chmod -R ug=rwX,o=rX /path
大文字のX
は、次の場合に実行ビットを設定します。
ファイルはディレクトリであるか、すでに一部のユーザーの実行権限を持っています
(chmod
manページから引用)。
または、find
を使用する場合
find /path \( -type f -exec chmod ug=rw,o=r {} + \) -o \
\( -type d -exec chmod ug=rwx,o=rx {} + \)
バリエーションはありますが、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つは、最大値(多くの場合10)に達するまで内部コマンドラインの最後にファイルを追加することにより、chmod
への呼び出し回数を減らし、次にコマンドを呼び出して新しいコマンドの再構築を開始します。最後のステートメントは、ファイルごとに新しいプロセスを生成するため、効率が低下します。