web-dev-qa-db-ja.com

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

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

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

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

11
Kumarjit Ghosh

ファイルとディレクトリの両方で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 {} +
21
Kusalananda

find-exec ... +構文、xargsを使用する意味はあまりありませんが、必要に応じて次のようにします。

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