※ 引述《ymzk ()》之铭言:
> 在网络上有看到一个方法可以把某个目录下所有资料夹都变成群组可执行
> 指令如下
> sudo chmod g+x $(find ./ -type d)
$() 里面可以放入要执行的命令,最后 find 命令透过 stdout 输出的讯息
当作为 chmod g+x 传入的档案目录名称。
其实不建议这样用,因为路径若有空白这类情况时候会出错
> 但我执行时会出现一些怪怪的讯息, 例如一些资料夹他说根本找不到
比方有个目录名称叫做 "My Documents" 来说,上面语法就变成:
sudo chmod g+x My Documents
一般要避免该问题有很多方式,比方:
find ./ -type d -exec chmod g+s {} \;
不过这语法效能很糟糕,因为有找到 10000 个项目就要呼叫 chmod 高达
10000 次,所以一般会改用:
find ./ -type d | xargs chmod g+s
其中 find 找到符合的列表会透过 stdout 输出,xargs 能够透过 stdin 读入
刚刚 find 给的输出结果,然后当作为执行 chmod g+s 要带入的引数。所以这
语法基本上类似于 chmod g+s $(find ./ -type d)
当然上面那语法也会遇到档案有空白等问题,有空白字符等档名会被当作两个
项目。所以一般使用会使用:
find ./ -type d -print0 | xargs -0 chmod g+s
其中 find 搭配 -print0 就是透过 stdout 输出的列表内改用 NULL 字符当档名
分隔,而不是使用原本一般的空白字符。而要呼叫 xargs 时候也要传入 -0 告知
读入的资料以 NULL 字符当分隔,如此就可以解决刚刚谈到的问题。
find + xargs 基本上效能不错,不过有时候 find 结果带多可能会让 xargs 在
带入结果时候发生执行命令带入引数发生 Argument list too long 的错误,一般
要避开可以这样:
find ./ -type d -print0 | xargs -n 100 -0 chmod g+
就是一次处理单位为 100
> 另问一下这到底是什么原理?
> 他是执行了很多chmod指令还是一个chmod指令后面带了很长的参数?
> 如果是后者会不会因为太长而有部份失败@@"