次の機能を持つバックアップスクリプトがあります。
function change_rights()
{
chown -R ${OWNER}:${GROUP} ${DIR}
find ${DIR} -type f -exec chmod 0640 {} \;
find ${DIR} -type d -exec chmod 0770 {} \;
}
問題は、これが大規模で、${DIR}
所有者と権限を変更するには、ディレクトリを少なくとも2回通過する必要があり、これは非常にリソース集約的であることです。
所有者を変更する方法やコマンドはありますか?そして右同時に?つまり、inodeの内容が一度に変わるのでしょうか?
私はext4
ファイルシステムの作業をしています。
答え1
findを使用する代わりに、隠しファイルをglobし、再帰的なglobbingを実行するために必要なシェルオプションを設定してから、次のことを実行できます。
for entry in ${DIR}/**/**; do
chown "${OWNER}:${GROUP}" "${entry}"
if [[ -d "${entry}" ]] ; then
# do the thing you do on directories
else
# do the thing you do on files
fi
しかし、正直なところ、2回見ているのではなく、何千ものプロセスを作成するオーバーヘッドは、chown
おそらく2回見ているのではなく、シェルロジックでファイルであることを確認するのと同じ価値はありません。最終的には直接ベンチマークする必要があります。
私が見つけた構文はfind
時々少し混乱していましたが、私に役立つ構文は次のとおりです。
find \( -exec /usr/bin/echo ${OWNER}:${GROUP} '{}' \; \) \
-a \( \
\( -type f -exec /usr/bin/echo 0640 '{}' \; \) \
-o \( -type d -exec /usr/bin/echo 0770 '{}' \; \) \
\)
その意味を理解したら、/echo
に変更してくださいchown
。chmod
ここで問題は、ディレクトリに入る前にまずディレクトリ権限を変更することです。後で直接読んで一覧表示できないと、エラーが発生する可能性があります。
とても巨大です
何百万ものファイルがある場合は、標準設定を使用してext4よりも適切なユースケースに適したものを使用することを検討してください。正直なところ、私が収集したソースツリーを使用しても、実際には時間がかかりません。