如何使批处理过滤脚本可执行?

How do I make a batch filtered script executable?

我只是(递归地)搜索文件夹中的所有 shell 脚本:

$ find * | ag "\.sh\b"

现在如何使它们可执行,例如

$ (lambda file_list: chmod +x file_list) (find * | ag "\.sh\b")

抱歉出现这个奇怪的 Python/Shell 伪代码,我不知道还有什么方法可以简洁地表达它。

检查Command Substitution

在反引号中嵌入一个命令,使其成为另一个命令的参数:

$ chmod +x `find * | ag "\.sh\b"`

只需使用 find-exec 选项:

find -type f -name '*.sh' -exec chmod +x {} +

chmod 命令是通过在末尾附加每个选定的文件名来构建的:chmod +x f1.sh f2.sh ...{} 替换为正在处理的当前文件名。参见 man find

关于您当前的命令

您当前的命令不正确,主要是因为您将当前目录中的 所有 节点隐式传递给 find,因为星号 (*) 扩展为当前目录下的所有文件find file1 file2 dir1 dir2 ...。显然,查找所有扩展名为 .sh 的文件的效率不是很高。

第二个问题是ag工具的使用,因为find非常有能力按模式搜索文件名。例如,阅读 -name-path-regex 选项。为了找到所有带有 .sh 扩展名的文件,只需将 '*.sh' 模式传递给 -name 选项("test",就 find 而言)。请注意,应转义该模式以防止在 shell 上下文中进行解释。