是否有一个通用的 bash 函数可以chmod
在各个方面进行模仿,除了它还让我区分文件和目录?
我知道这个答案已经有很多可用的示例,如下所示:
find /path/to/base/dir -type d -exec chmod 755 {} +
chmod 755 $(find /path/to/base/dir -type d)
find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
...但是这些都带有硬编码的参数,并且难以记住和输入。1)
我想对其进行概括并使其动态化,以便我能够执行以下操作,例如:
# for directories
chmod -d <any valid argument list for chmod> # or
chmodd <any valid argument list for chmod>
# for files
chmod -f <any valid argument list for chmod> # or
chmodf <any valid argument list for chmod>
我自己尝试创建一个可行的解决方案,但由于我的 bash 技能低于标准,而且我不确定如何解析正确的参数并将它们插入正确的位置,所以它非常粗糙且有限:
function chmodf {
find . -mindepth 1 -type f -print0 | xargs -0 chmod "$@"
}
function chmodd {
find . -mindepth 1 -type d -print0 | xargs -0 chmod "$@"
}
当然,我更喜欢如下(伪代码):
function chmodd {
paths = extract paths from arguments list
recursive = extract recursive option from arguments list
otherargs = remaining arguments
if( recursive ) {
find <paths> -mindepth 1 -type d -print0 | xargs -0 chmod <otherargs>
}
else {
find <paths> -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 chmod <otherargs>
}
}
您是否已经知道存在这样的功能/二进制文件,或者您能帮助我实现这一目标吗?
我想要这个的主要原因是,我发现自己经常需要在目录上递归设置 setgid 位,而不是在文件上。但是,据我所知g+S
,chmod 没有大写字母选项。
1)我知道 unix 慢板“做一件事并做好”,或者在那个程度上,但老实说,至少据我所知,经过近半个世纪的存在chmod
并看到对此行为的大量请求,chmod
尚未使用此功能进行修改。这似乎是一个显而易见且合适的功能chmod
。
我的尝试:
函数和别名轮流
进入
同样
chmodd …
变成find … -type d …
.它主要是关于重新安排论点。几乎没有解析。之前的所有内容都
--
被视为args for chmod
. 之后的一切都--
视为starting points
forfind
。我们不想真正chmod
递归地运行,但我们可能会也可能不会find
递归地运行。-prune
由于在正确的位置执行非递归操作。如果有-R
或--recursive
在args for chmod
则它将消失但-prune
不会出现。笔记:
我认为代码是可移植的。我故意避免使用数组。
chmodf
并且chmodd
可能是函数。即使这样,他们也应该调用chmodx
以保持代码DRY。将它们实现为两个独立的功能是不优雅的。--
是强制性的,因为我决定亲吻。当然可以将路径名与其他参数区分开来,而无需使用--
. 实际上chmod
是这样做的。它知道自己的语法、所有可能的选项等等;所以其他一切都必须是要操作的文件。将这些知识和功能嵌入到 shell 脚本中就是WET。如果你真的想让事情在没有的情况下工作,--
那么你应该通过改进chmod
、修改它的源来解决你的问题。滥用方法有:
starting points
注入例如(因为become )。-maxdepth 3
3 -maxdepth
starting points
points starting
args for chmod
. 如果args for chmod
包含;
或{} +
则-exec
主节点将在该行的早期终止。这允许您注入更多的原色;或通过生成无效语法来破坏整个命令。虽然在技术上是可行的,但这样的技巧是丑陋的。如果我需要使事情复杂化,我肯定更愿意重新编写一个
find
命令。我设法想出了我自己的初始功能的更高级版本:
仅文件
chmod
(chmodf
):仅目录
chmod
(chmodd
):我唯一担心的是某些参数可能不明确,并被错误地解释为带有
if [[ -e "$arg" ]]; then
. 不知道这通常是如何处理的,即使是getopts
. 但除此之外,它似乎按我的意图工作。例子:
仍然好奇其他人是否有替代解决方案。