我尝试放入find
函数内部并使用以下最小工作示例捕获传递给该函数的参数:
功能 DO { ls $(find . -type f -name "$@" -exec grep -IHl "TODO" {} \;) }
但是,当我执行时DO *.tex
,我得到“查找:路径必须在表达式之前:”。但是当我直接这样做时:
ls $(find . -type f -name "*.tex" -exec grep -IHl "TODO" {} \;)
然后我得到所有包含“TODO”的TeX文件。
我在函数中尝试了很多东西DO
,例如\"$@\"
, '$@'
,我更改了引号,但行为仍然相同。
那么,如何强制在函数内部找到工作?
您的代码中有几个问题:
如果模式与当前目录中的任何文件名匹配,则
*.tex
在调用函数时将扩展模式。DO
您必须将模式引用为'*.tex'
,"*.tex"
或者\*.tex
在调用函数时引用。ls
不需要。您已经拥有两者find
,grep
并且能够报告找到的文件的路径名。-name "$@"
只有在"$@"
包含单个项目时才能正常工作。使用会更好-name "$1"
。有关允许多种模式的解决方案,请参见下文。函数可以写成
像这样调用这个函数
将使其执行
如果文件包含字符串,这将生成具有这些文件名后缀的文件的路径名列表
TODO
。要使用
grep
而不是find
打印找到的路径名,请将-exec ... -print
位更改为-exec grep -lF 'TODO' {} +
. 这将更有效率,特别是如果您有大量与给定表达式匹配的文件名。无论哪种情况,您都绝对不需要使用ls
.允许用户使用
您的功能可以更改为
您需要将参数引用到函数中,否则 shell 会扩展它并且函数获取文件列表,而不是通配符掩码:
然后您可以使用 just
"$1"
而不是"$@"
,因为只有一个参数。