【问题标题】:How to set permissions for every directory along a directory path如何为目录路径中的每个目录设置权限
【发布时间】:2011-11-06 09:05:54
【问题描述】:

我正在我希望可执行的网络服务器上创建一个远程目录路径。我使用如下命令远程创建它:

ssh user@machine mkdir -p a/b/c/d/e/f

接下来,我希望能够对目录 a-f 进行 chmod,但避免在远程目录根目录上执行 chmod -r

是否有一种优雅的机制可以从 a/b/c/d/e/f 路径开始并执行有效的 chmod a+x a; chmod a+x a/b; chmod a+x a/b/c; ... 而无需解析每个 chmod?

【问题讨论】:

    标签: bash scripting chmod


    【解决方案1】:

    您可能会尝试按如下方式制作远程 bash 脚本(目录名称应以空格分隔):

    #!/bin/bash
    for i in $*
    do
      mkdir $i
      chmod a+x $i
      cd $i
    done
    

    或者您可以将umask 设置为umask 066,这将设置您创建的任何内容的默认权限。请参阅this 网站了解说明。

    【讨论】:

    • 这是chmod -r 所做的(最初当目录为空时)。
    • 迭戈,请参阅答案的第二部分和第三部分(刚刚添加)。
    • 好吧,我不太喜欢这个有几个原因。首先,您使用$*,这意味着必须使用由空格分隔的目录调用脚本(您没有指定)。此外,您在循环的每个步骤中更改目录。这被认为是应用程序/环境状态的太大变化,因为例如在循环结束时,您在哪个目录中?最后,如果您可以从实际目录中更改目录,则不必更改目录,就像我在回复中所做的那样。
    • @Diego,我已经更清楚地指定了对空格的需求。我认为 Rich 可能正在寻找一个普遍的答案,所以我觉得 $* 是一个不错的选择。当您运行脚本时,它会分叉到一个单独的进程中,该进程继承但不编辑原始环境(例如,参见stackoverflow.com/questions/874452/…);如果你测试脚本(我做过),你会发现这是真的。您担心脚本结束时我们在一个随机目录中是错误的。
    【解决方案2】:

    可能是这样的:

    DIR=
    for i in a b c d e f; do
        DIR=$DIR$i/
        chmod a+x $DIR
    done
    

    【讨论】:

    • 谢谢,我最终使用了这种方法的变体。
    【解决方案3】:

    你可以使用find命令

    find /path_at_remote -type d -exec chmod a+x "{}" \;  (not tested)
    

    【讨论】:

    • 这种方法没有任何问题,只需将其放在 ssh 命令的末尾即可。注意如果您的目录中有空格,那么您可能希望避免使用 -exec 而不是使用find /somedir -type d -print0 | xargs -0 chmod a+x
    • Nah.. 它可以与 -exec 和 "{}" 一起用于带有空格的目录。使用 GNU find,也无需使用xargs
    • 这个chmods 下面的所有目录/path_at_remote。我只对chmoding 属于特定路径的目录感兴趣,例如/a/b/c/d/e/f
    【解决方案4】:
    #!/bin/sh
    
    perm=$1
    shift
    
    # iterate over all argument paths
    for p; do
        # chmod up successively from destination 
        while true; do
            case $p in
                */* ) chmod "$perm" "$p"
                       p=${p%/*} ;;
                * ) break ;;
            esac
        done
    done
    

    【讨论】:

    • 当然,如果您在以前没有写访问权限的地方添​​加写访问权限,这会出现问题,因为它从目标开始并且沿着路径向上工作。当然可以解决这个问题,但它会增加一些复杂性,所以我不会。
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2012-07-24
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多