2013-02-06 26 views
1

不使用任何Perl模块,只用几行代码就可以在Perl中执行以下操作:搜索或查找包含字符串或模式匹配的文件

find . -type f | xargs grep -l "2000.*Created" | cut -c3-100 

以上只给出了包含“2000. * Created”的文件的文件名。我想在Perl中做这件事,并将结果推送到一个数组(文件名数组)中。

我发现Perl File :: Finder模块具有类似的功能,但在我目前的工作环境中,我无法访问或下载任何模块。

这可以在一行或两行代码中完成吗?

+0

什么是'cut'命令末尾的目的是什么?去掉路径中的'“./”'?另外,File :: Finder只是File :: Find的一个包装,它是perl 5中的核心模块。 – TLP

回答

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线是防止多个匹配的短路。

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会自动地做挂钩管你的所有的工作,这是很重要的。

open my $fh, '-|', 'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100' || die 'cannot execute'; 
while(<$fh>) { chomp ; push(@a,$_)} 

作为一个侧面说明,find | xargs都将有一些问题,如果你有空格的文件名:

这也可以使用新的3参数的open写的。您可以解决,随着-print0行动find-0国旗xargs

find . -type f -print0 | xargs -0 -l "2000.*Created" | cut -c3-100 
相关问题