chmodコマンドを選択的に使用する


11

特定のディレクトリの下にあるすべてのファイルとサブディレクトリに755権限を設定したいのですが、755権限のないコンポーネントに対してのみchmod 755を実行したいです。

find /main_directory/ -exec chmod 755 {} \;

findコマンドが長いリストを返す場合、これには長い時間がかかります。statコマンドを使用して各コンポーネントのOctalファイルレベルのアクセス許可を確認し、if-elseを使用してファイルのアクセス許可を切り替えることができることはわかっていますが、単一行のアプローチを使用findしてxargs、最初にファイル/ディレクトリのアクセス許可を確認します、chmodそれが別の値に設定されている場合はを使用して755に変更します。


6
これは時期尚早の最適化であるかもしれません、そして、それはより速いとしてもうまく行かないかもしれません。これらのチェックをすべて実行すると、速度が低下する場合があります。より高速であることを確認するためのテストは、これをたくさん行う必要がある場合にのみ効果があります。
ctrl-alt-delor

3
おそらく、すべてのファイルに実行権限を与えたくないでしょう。これはセキュリティリスクを引き起こします。(これは、MicrosoftのWindows上のウイルスベクターの1つです。すべてが実行可能です)。シンボリックモードでは、次のように言うことができますu+rw,go+r,go-w,ugo+X。大文字に注意してください。
ctrl-alt-delor

私は@ ctrl-alt-delorに同意しますが、あなたが尋ねたものに近いものを提案します、u = rwX、go = rXこれは同じことを達成するはずです。
penguin359

回答:


21

755ファイルとディレクトリの両方の権限を変更したい場合、find(少なくともパフォーマンスの観点から)を使用することには実質的な利点はありません。

chmod -R 755 /main_directory

find既に755アクセス許可を持っているもののアクセス許可の変更を回避するために(ctimeタイムスタンプの更新を回避するために)本当に使用したい場合は、各ディレクトリおよびファイルの現在のアクセス許可もテストする必要があります。

find /main_directory ! -perm 0755 -exec chmod 755 {} +

-exec ... {} +合格できるだけ多くのパス名として収集する! -perm 0755テストをし、実行しchmod、一度にそれらのすべてに。

通常、すべてのファイルが実行可能とは限らないように、ファイルとディレクトリのアクセス許可を個別に変更する必要があります。

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

魅力のように働いた、ありがとう。よろしく、クマルジット
クマルジットゴーシュ

1
ここ+;は、代わりに使用すると大きな違いが生じると思います。
ケビン

これは迅速な方法です-チェックを避けます。さらに、findを使用して、変更する権限を持つファイルのみのリストを作成します。これにより、変更できないファイルでchmodエラーが発生するのを回避できます。<pre> <code>#rwx、rw、wx、wは検索のみ。-user $(whoami)-perm / 002!-perm 0755 -exec chmod 0755 {} \; #findを2つの操作に分割します。-user $(whoami)-perm / 002!-perm 0755> $(</ tmp / chfiles.txt)内のファイルの/tmp/chfiles.txt do chmod --quiet 0755 "$ {file}"完了</ code> </ pre>
Chris Reid

@ChrisReidパス名に空白文字が含まれている場合、そのようなパス名のリストをループすると壊れます。
Kusalananda

スクリプトで内部フィールド区切り文字(IFS)を '\ n'に変更する必要があると思います。これらは環境設定であり、シェルがそれらを解釈する方法は、それらの設定の値に依存します。ダミーファイルを使用する前にスクリプトをテストして、ファイルの名前変更や上書きなどの大げさなディスターを探し出します。IFSを設定するシェルのprintfの方法が好きです。IFS = $(printf "\ n")#とても読みやすい
Chris Reid

1

find得ている-exec ... +構文を使用して多くのポイントはありませんxargsが、あなたはそれを求めるよう:

find /main_directory -not -perm 0755 | xargs chmod 755

1
また、潜在的な攻撃者が空白やその他の特殊文字を含むファイル名を作成できる場合、xargsが-0(find と組み合わせて-print0、GNU拡張である)なしでセキュリティ上かなり問題になる可能性があることに注意してください。-execできる
限り

xargs使用する必要はありません(使用するだけ-execです)。使用する場合は、Matijaが言うように-print0/ を使用する必要があります-0
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.