2013-02-06 31 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 
相關問題