Re: [问题] 关于bash指令

楼主: kenduest (小州)   2016-05-04 01:37:58
※ 引述《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指令后面带了很长的参数?
> 如果是后者会不会因为太长而有部份失败@@"
作者: niker (新月曲如眉)   2016-05-04 02:50:00
推小州老师讲解。
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-05-04 03:08:00
推 平时没处理到那么多还真的不会考虑到
作者: Neisseria (Neisseria)   2016-05-04 10:21:00
推小州老师讲解
作者: chababa (洽八八)   2016-05-04 15:50:00
好强,谢谢分享
作者: filiaslayers (司马云)   2016-05-04 16:07:00
为什么用xargs的效能会好过用exec参数?
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2016-05-04 16:23:00
刚刚看了 find 的 manpage 说 \; 换成 + 也会有类似效果 @@
作者: danny8376 (钓到一只猴子@_@)   2016-05-04 16:39:00
xargs其实很类似于$()的功能 不过xargs比较弹性
作者: soem (流水)   2016-05-04 22:43:00
是因为那个语法是把前面find找出来的pile给xargs后面接的指令,一次做完。这样就不用call很多次exec后面的指令pipe 我打成了什么..
作者: Qiqi (泼泼)   2016-05-05 00:11:00
白话一点差不多就是chmod file1chmod file2chmod file3跟chmod file1 file2 file3的差别
楼主: kenduest (小州)   2016-05-05 00:41:00
目前的 find 应该都可以吃 -exec {} + 语法这就的确与 xargs 行为类似,所以也不一定需要 xargs 了

Links booklink

Contact Us: admin [ a t ] ucptt.com