如何传递带有嵌入式通配符的文件名以查找而不限于在本地找到的文件?

How to pass a filename with embedded wildcards to find without limiting to files found locally?

我有一个脚本使用 find 来查找与用户输入匹配的文件。基本上,用户输入类似 test* 的内容,它应该会找到所有匹配的文件。

我遇到的问题是,如果当前目录中有一个文件与用户输入的文件名模式相匹配,它只会查找该文件。也就是说,如果用户输入 fred* 并且当前目录中有一个名为 frederica 的文件,则脚本只会找到名为 frederica 的文件。这是问题的示例:

>ls
test1  test2  test3  test4  test5  words
>tmp()
> {
>    my_file=""
>    find . -iname "$my_file" 
> }
>tmp test*
./test1
>

如果我输入 tmp test*,我希望它 return 五个文件 test1test5 .相反,它只是 return 第一个。此外,如果我搜索 /,它仍然只会从每个目录中找到名为 test1 的 return 个文件。

当然,实际的脚本更复杂,我已经开发了一个涉及 "wildcard option" 的解决方法(例如,-w 1 表示前导星号和尾随星号等),但我会真的只是希望能够让用户输入带有通配符的文件名。

提前致谢

test* 扩展为 test1 test2 test3 test4 test5。您只查看 </code>,即 <code>test1

尝试将其命名为 tmp 'test*'

当您按照自己的方式调用函数时,解释调用的 shell 会尝试查找匹配的文件(这是在进入函数之前完成的),并且可能会发生不同的事情:

  • 如果 glob 失败并且设置了 failglob shell 选项,那么函数根本不会执行。由于默认的 shell 选项,您可能没有看到这个。

  • 否则,如果 glob 失败并且设置了 nullglob shell 选项,那么 glob 的结果什么也没有,并且不会将任何参数传递给您功能。你可能也没有经历过。

  • 否则,如果 glob 失败并且未设置 failglob shell 选项,则 glob 的结果是 glob 表达式的任何内容,并将其用作参数价值。然后,这个 glob 表达式按原样传递给 find,并且 find 做你想做的,因为它在内部实现了 globbing。你很幸运,它有效,但它有效。

  • glob 成功并生成一个文件列表,用作函数的参数列表。您使用 </code> 调用 <code>find,因此只会考虑这些参数中的第一个,从而导致您不想要的结果。

双引号或单引号禁用 globbing。如果从脚本中使用,您可以这样做:

tmp "test*"

如果您想从命令行使用此命令,您唯一的选择是完全禁用 globbing,set -f,这很可能有缺点。