如何在 perl 中使用 globbing 来处理包含多个文件的一行,避免使用 xargs/find/etc

Jos*_*erg 7 shell perl glob

当有太多匹配文件时,bash如果您在命令行上包含 glob 模式,则 shell 会像中断一样

perl -pi -e 's/hi/bye/' too_many_files*
Run Code Online (Sandbox Code Playgroud)

您可以使用xargs、 gnuparallel或来解决此find问题,但对于复杂的命令,这些命令可能很难在引用方面正确使用,而且它们的效率也可能低于运行perl一次。

有没有办法使用 的perl内置通配支持来实现类似的功能?(这不起作用)

perl -pi -e 's/hi/bye/' 'manyfiles*' # <-- Does not work.
Run Code Online (Sandbox Code Playgroud)

Jos*_*erg 6

正如此答案中所述,您可以使用BEGINperl(而不是 shell)来扩展文件列表:

在原来的基础上稍作修改:

将 globing 留给 perl 而不是 bash,后者有局限性,

perl -pi -e 'BEGIN{ @ARGV = glob(pop) } s/#//g' "*"
Run Code Online (Sandbox Code Playgroud)

或者当 Globed 目录中有空格时,

perl -MFile::Glob=bsd_glob -pi -e 'BEGIN{ @ARGV = bsd_glob(pop) } s/#//g' "*"
Run Code Online (Sandbox Code Playgroud)

有关globvs的更多信息bsd_glob,请参阅这篇文章

(这是故意重复的,因为我很难用我想到的搜索词快速找到答案。)