如何使批处理过滤脚本可执行?
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 伪代码,我不知道还有什么方法可以简洁地表达它。
在反引号中嵌入一个命令,使其成为另一个命令的参数:
$ 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 上下文中进行解释。
我只是(递归地)搜索文件夹中的所有 shell 脚本:
$ find * | ag "\.sh\b"
现在如何使它们可执行,例如
$ (lambda file_list: chmod +x file_list) (find * | ag "\.sh\b")
抱歉出现这个奇怪的 Python/Shell 伪代码,我不知道还有什么方法可以简洁地表达它。
在反引号中嵌入一个命令,使其成为另一个命令的参数:
$ 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 上下文中进行解释。