【发布时间】:2019-09-19 06:51:40
【问题描述】:
我试图到达一个 shell 命令,我需要将“Mach-O 可执行文件”作为文件命令输出的文件的权限修改为 755。
我能够做到这一点 - find . -type f -exec file {} \; | grep executable
但是我该如何对它们进行 chmod 755 呢?
【问题讨论】:
我试图到达一个 shell 命令,我需要将“Mach-O 可执行文件”作为文件命令输出的文件的权限修改为 755。
我能够做到这一点 - find . -type f -exec file {} \; | grep executable
但是我该如何对它们进行 chmod 755 呢?
【问题讨论】:
find . -type f -exec file {} + |
sed -n -e '/Mach-O .* executable/s/:.*//p' |
xargs chmod 755
通过使用+ 而不是\;,file 命令的执行频率将降低(它的行为有点像xargs)。 sed 命令默认不打印 (-n),但会查找 Mach-O 可执行文件并删除文件名后 : 之后的材料,因此它会列出文件。 xargs 命令在它从标准输入中读取的参数上运行 chmod 755。假设您没有包含换行符、空格、制表符和其他奇怪字符的可执行文件名,那应该可以完成这项工作。如果您不坚持使用 POSIX 可移植文件名字符集,您可能需要更加努力。
请注意,如果当前目录下没有可执行文件,那么您将收到来自chmod 的使用消息,因为即使没有参数,xargs 也会运行该命令一次。 GNU xargs 有一个选项 -r 来避免命令的“空运行”调用; macOS 上的版本不支持。
【讨论】:
只需使用gawk+ xargs:
find . -type f -print0 -exec file {} \; | gawk -F\: '/Mach-O .* executable/ {print $1}' |xargs chmod 755
【讨论】: