我有一个包含 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
更改此行为。nullglob
globfail
此外,默认情况下,名称以句点开头的文件不包含在路径名扩展中。但是,如果您指定以句点开头的模式,它们将被包括在内:
$ 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
。