如果不使用任何Perl模块,可以在Perl中执行以下操作,只需要几行代码吗?
find . -type f | xargs grep -l "2000.*Created" | cut -c3-100
上面只给出了包含“2000. * Created”的文件的文件名。我想在Perl中执行此操作并将结果推送到数组(文件名数组)。
我发现Perl File :: Finder模块具有类似的功能,但在我目前的工作环境中,我无法访问或下载任何模块。
可以用一行或两行代码完成吗?
答案 0 :(得分:1)
当然有可能。
perl -MFile::Find -lwe '
find(sub { -f && push @ARGV, $File::Find::name }, '.');
while(<>) { if (/2000.*Created/) { print substr($ARGV,2); close ARGV; } }'
File::Find
是一个核心模块,因此它应该已经存在于您的系统中。 find
子例程将查找所有常规文件并将其推送到@ARGV
,以便我们可以使用菱形运算符读取它们。然后我们循环检查使用正则表达式检查内容的文件。如果找到,我们打印文件名而不包含前2个字符(我假设它等同于cut -c3-100
)。 close ARGV
行是短路以防止多次匹配。
答案 1 :(得分:0)
我喜欢File :: Find这个例子更好 - 它更便携,File :: Find可以做一些非常漂亮的东西。但是,我会提到一种方法,这种方法对于没有内置支持的其他命令很有用。
open F,'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100 |' || die 'cannot execute';
while(<F>) { chomp ; push(@a,$_)}
请注意打开的管道(|
)...这很重要,因为Perl会自动完成为您连接管道的所有工作。
这也可以使用较新的3参数open:
编写open my $fh, '-|', 'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100' || die 'cannot execute';
while(<$fh>) { chomp ; push(@a,$_)}
作为旁注,如果您的文件名包含空格,find | xargs
会出现问题。您可以使用-print0
上的find
操作和-0
上的xargs
标记解决此问题:
find . -type f -print0 | xargs -0 -l "2000.*Created" | cut -c3-100