如何在目录路径上设置每个目录的权限

5
我正在创建一个远程目录路径在 web 服务器上,我希望它是可执行的。我通过如下命令远程创建它: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 呢?
4个回答

2
可能是这样的:

可能是这样的:

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

谢谢,最终我采用了这种方法的变体。 - Rich

1
你可以尝试创建一个远程Bash脚本来执行以下操作(目录名称之间应该用空格分隔):
#!/bin/bash
for i in $*
do
  mkdir $i
  chmod a+x $i
  cd $i
done

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


这是 chmod -r 的作用(当目录为空时)。 - Diego Sevilla
Diego,请查看答案的第二部分和第三部分(刚刚添加)。 - Richard
嗯,出于几个原因,我不太喜欢这个。首先,你使用$*,这意味着必须使用空格分隔的目录调用脚本(你没有指定)。此外,你在循环的每一步中更改目录。这被认为是应用程序/环境状态的太大变化,因为例如,在循环结束时,你在哪个目录中?最后,如果可以从实际目录中执行操作而无需更改目录,则无需更改目录,就像我在我的回复中所做的那样。 - Diego Sevilla
@Diego,我更清楚地指定了需要空格的需求。我认为Rich可能在寻找一个通用的答案,所以我觉得$*在这里是一个不错的选择。当你运行一个脚本时,它会分叉成一个单独的进程,该进程继承但不编辑原始环境(例如,请参见https://dev59.com/L3NA5IYBdhLWcg3wrPyq);如果你测试脚本(我做了),你会发现这是真的。你担心脚本结束时我们处于一个随机目录中是不必要的。 - Richard

0
#!/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

当然,如果您正在添加写访问权限而以前没有写访问权限,则会出现问题,因为它从目标开始并沿路径向上工作。当然可以修复这个问题,但这将增加一些复杂性,所以我不会这样做。 - tripleee

-1
你可以使用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 - Marcin
嗯...对于带有空格的目录,使用-exec和"{}"是完全可以正常工作的。使用GNU find,也不需要使用xargs。 - ghostdog74
1
这将chmod所有在/path_at_remote下的目录。我只想chmod属于特定路径如/a/b/c/d/e/f的目录。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接