是否有一个通用的 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
。