如何在具有相同扩展名的多个输入文件上运行Perl脚本?
perl scriptname.pl file.aspx
我希望它能够运行当前目录中的所有aspx文件
谢谢!
答案 0 :(得分:7)
答案 1 :(得分:3)
您可以使用通配符
将这些文件传递给perl 你脚本中的
foreach (@ARGV){
print "file: $_\n";
# open your file here...
#..do something
# close your file
}
在命令行上
$ perl myscript.pl *.aspx
答案 2 :(得分:2)
您可以显式使用glob
来使用shell参数,而不必依赖shell行为。
for my $file ( map {glob($_)} @ARGV ) {
print $file, "\n";
};
您可能需要控制文件名重复的可能性,并扩展了多个参数。
答案 3 :(得分:1)
如果你在Linux机器上,你可以尝试这样的事情。
for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done
答案 4 :(得分:0)
对于包含-n
或-p
的简单单行,您需要
perl -i~ -pe 's/foo/bar/' *.aspx
-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中本地执行此目录递归。
答案 5 :(得分:0)
例如,处理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);
答案 6 :(得分:-2)
您也可以传递您拥有aspx文件的路径并逐个阅读。
#!/usr/bin/perl -w
use strict;
my $path = shift;
my @files = split/\n/, `ls *.aspx`;
foreach my $file (@files) {
do something...
}