将目录中的所有文件作为一个参数传递给 perl 脚本

将目录中的所有文件作为一个参数传递给 perl 脚本

我有一个包含 50 个文件的目录,我想同时将它们全部传递给一个 perl 脚本,名称之间只有一个空格,如...

./perl_script.pl file1 file2 file3 .. file50

这些文件都有非数字名称。

我了解如何在循环中一次将所有文件传递给 perl 脚本,但我很难一次传递所有文件。

答案1

您正在寻找的功能由 shell 处理。它被称为路径名扩展。例如,假设您位于包含文件 file1 file2 file3 .. file50 的目录中。您可以通过以下方式指定目录中以 开头的所有文件file作为 Perl 脚本的参数:

./perl_script.pl file*

对于 shell,*意味着清零或移动任何字符。 shell 查找名称file以零个或多个任意字符开头并后跟的所有文件。此外,如果您想指定当前目录中的所有文件:

./perl_script.pl *

如果您想指定其他目录中的所有文件,请使用:

./perl_script.pl /some/other/dir/*

请注意,这是 shell 功能,而不是 perl 功能。 shell 执行路径名扩展参数列表被传递给 perl。因此,它适用于任何 shell 命令。如果您想在不实际运行 perl 脚本的情况下测试路径名扩展,您可以简单地使用 echo:

echo /some/other/dir/*

这将显示与 perl 脚本所看到的相同的路径名扩展结果。

特别案例

默认情况下,如果没有与您的模式匹配的文件,则返回模式本身:

$ echo *bash*
*bash*

在 下,可以使用和选项bash更改此行为。nullglobglobfail

此外,默认情况下,名称以句点开头的文件不包含在路径名扩展中。但是,如果您指定以句点开头的模式,它们将被包括在内:

$ echo .*bash*
.bash_history .bash_logout .bash_profile .bashrc

更多功能

除了 之外*,还有一个特殊字符?,表示任意一个字符。因此file?将扩展到 file1 而不是 file10。

还可以指定字符组。因此,file[123]假设它们存在,将扩展到文件 file1、file2、file3,但不扩展到 file4。 file[[:digit:]]扩展到名称file由一位且仅一位数字组成的所有文件。

高级 shell,如 bash,有更多选项。在 中的“路径名扩展”下阅读有关它们的信息man bash

相关内容