如何在具有相同扩展名的多个输入文件上运行 Perl 脚本?
perl scriptname.pl file.aspx
我希望它对当前目录中的所有 aspx 文件运行。
对于带有
-n
或 -p
的简单单行,您想要
perl -i~ -pe 's/foo/bar/' *.aspx
-i~
表示修改每个目标文件,并保留原始文件作为备份,并在文件名称中添加~
后缀。 (省略后缀即可不留下备份。但是,如果您仍在学习或试验,这是一个坏主意;完成后删除备份比在弄乱某些内容时从常规备份中恢复原始文件要麻烦得多.)
当然,如果您希望 Perl 脚本将输出写入标准输出,而不修改文件,则根本不要放置
-i
选项。
如果你的 Perl 代码对于单行代码来说太复杂(或者只是足够有用以可重用),显然将
-e '# your code here'
替换为 scriptname.pl
...不过也许可以重构 scriptname.pl
以便它接受文件名列表参数,只需使用 scriptname.pl *.aspx
在当前目录中的所有 *.aspx
文件上运行即可。
如果您需要递归目录结构并查找具有特定命名模式的所有文件,则
find
实用程序非常有用。
find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} +
如果您的
find
不支持-exec ... +
,请尝试使用-exec ... \;
,尽管它会更慢并启动更多进程(您找到的每个文件一个,而不是尽可能少地处理所有文件)。
要仅扫描某些目录,请将
.
(命名当前目录)替换为要检查的以空格分隔的目录列表,甚至使用 find
查找目录本身(然后可能探索 -execdir
来查找目录)在 find
使用复杂、错综复杂、关键业务、可能是秘密的 find
选项谓词列表选择的每个目录中执行某些操作。
find2perl
在 Perl 中本地执行此目录递归。
如果不明显,
-pi~
是 -p -i~
的缩写形式;这称为“选项聚类”。
如果你使用的是 Linux 机器,你可以尝试这样的方法。
for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done
您可以使用通配符将这些文件传递给 Perl
在你的脚本中
foreach (@ARGV){
print "file: $_\n";
# open your file here...
#..do something
# close your file
}
在命令行上
$ perl myscript.pl *.aspx
您可以显式使用
glob
来使用 shell 参数,而不必过多依赖 shell 行为。
for my $file ( map {glob($_)} @ARGV ) {
print $file, "\n";
};
您可能需要通过扩展多个参数来控制文件名重复的可能性。
例如处理
perl scriptname.pl *.aspx *.asp
在 Linux 中:shell 扩展通配符,因此 Perl 可以简单地
for (@ARGV) {
operation($_); # do something with each file
}
Windows 不扩展通配符,因此在 perl 中扩展每个参数中的通配符,如下所示。然后 for 循环以与上面相同的方式处理每个文件
for (map {glob} @ARGV) {
operation($_); # do something with each file
}
例如,这将在 Windows 下打印展开的列表
print "$_\n" for(map {glob} @ARGV);
您还可以传递aspx文件所在的路径并一一读取它们。
#!/usr/bin/perl -w
use strict;
my $path = shift;
my @files = split/\n/, `ls *.aspx`;
foreach my $file (@files) {
do something...
}