【问题标题】:How to chmod of subdirectories of a provided path (BASH)如何对提供的路径(BASH)的子目录进行 chmod
【发布时间】:2010-12-06 20:11:22
【问题描述】:

我需要一个脚本,它接受一个作为目录路径的命令行参数。脚本应该检查参数以确定它是否实际上是一个目录。如果是目录,则脚本应将位于其中的任何子目录的保护模式更改为 600。如果参数不是目录,则应打印出适当的消息。

我有

如果 [ -d $1 ] ;那么


其他

echo "这不是目录"

fi

基本上我不知道在空白行上放什么。我在玩 chmod 但我的行似乎想更改输入的路径而不仅仅是子目录。

【问题讨论】:

  • 600 是一个非常奇怪的目录权限掩码——您缺少执行/搜索位,这使得该目录对除 root 以外的所有人都毫无用处。

标签: bash permissions chmod


【解决方案1】:
([ -d "$1" ] && find $1 -type d -mindepth 1 | xargs chmod 600 | true) || echo 'Not a directory'

【讨论】:

  • 这个解决方案的3个问题:首先,如果任何涉及的路径有空格,它就会失败(解决方案:使用find "$1" ... -print0 | xargs -0 ...,或者find的-exec选项);其次,如果 $1 是目录,它会打印“Not a directory”,但 chmod 会出现一些错误(例如,您没有权限 chmod 某些子目录)(解决方案:使用 if ... then ... else ... fi 而不是 &&|| );最后,即使出现问题,它也会以状态 0(成功)退出。
  • 鉴于 ehemient 已经提供了这些替代方案,我只是提供单行解决方案,而不是复制已经提供的解决方案。通过将 find 设置为 true 来解决 chmod 失败很容易,例如“... 600 | 真)”。正在编辑...
【解决方案2】:
如果测试 -d "$1";然后 查找 "$1" -type d -exec chmod 600 '{}' \; 别的 echo "不是目录:$1" >&2 1号出口 菲

各种变体可能更快,但取决于古代findxargs 中没有的功能。

find "$1" -type d -exec chmod 600 '{}' +
find "$1" -type d -print0 | xargs -0r chmod 600

【讨论】:

  • 虽然就个人而言,我会跳过打印错误消息。用户的目标是“运行此命令后,所有子目录应具有 600 的权限”。如果你给它一个文件,这个条件就满足了,因为一个文件有零个子目录。
  • 如果我在设计它,我会同意你的看法:脚本只是find 命令,没有别的。但我主要在这里遵循 OP 的结构。
  • roger34 不清楚 $1 是否也应更改为 600。如果不是,则命令应启动 find "$1" -mindepth 1 -type d ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2012-01-03
  • 1970-01-01
  • 2012-11-08
  • 2020-05-31
相关资源
最近更新 更多