2010-08-22 49 views
1

我用這個更新中的每個文件的目錄Perl全局替換觸及每個文件 - 如何阻止它?

perl -pi -e 's/include\s?\(/include_once(/g' *.php 

它工作正常,但似乎修改目錄中的每一個*。PHP文件的訪問日期 - 是有辦法,我可以把它只修改其實際修改的文件的日期訪問權限?

+0

好吧,如果你不希望它來修改每一個PHP文件,不告訴它來修改每一個PHP文件。 perl無法知道一個文件在經過所有行並將它們寫入新文件之前不會擁有該模式。 – 2010-08-23 02:03:20

回答

2

我假設你的意思是修改時間,而不是訪問時間。

我這樣做,通過選擇文件來更新:

egrep -l 'include\s?\(' *.php | xargs perl -pi -e ... 
+1

爲了安全起見,最好使用egrep -lZ ... | xargs -0,以便帶有空格的文件名不會導致問題。 – Hudson 2010-08-22 22:42:35

+0

太好了,謝謝。我用... egrep -l'include?\('* .php | xargs perl -pi -e's/include \ s?\(/ include_once(/ g'-0 ... and it it完美地工作。 – glaucon 2010-08-22 22:45:17

1

出於好奇,我寫了就地編輯器的強勁處理所有的文件名,並試圖避免shell命令行長度問題的意圖。下面的程序需要一個或多個目錄(如果沒有指定,則默認爲當前目錄),並創建一個find ... | xargs ...管道,該管道試圖僅給那些需要調整的PHP源代碼@ARGV

#! /usr/bin/perl 

use warnings; 
use strict; 

BEGIN { 
    @ARGV = (".") unless @ARGV; 

    my $xargspid = open my $xargs, "-|"; 
    die "$0: fork: $!" unless defined $xargspid; 

    my @paths; 
    if ($xargspid) { 
    local $/ = "\0"; 
    while (<$xargs>) { 
     chomp; 
     push @paths => $_; 
    } 
    unless (close $xargs) { 
     my $status = $? >> 8; 
     die "$0: xargs exited $status" 
     if $status != 0 && $status != 123; 
    } 
    } 
    else { 
    my $findpid = open my $find, "-|"; 
    die "$0: fork: $!" unless defined $findpid; 

    if ($findpid) { 
     open STDIN, "<&", $find or die "$0: dup find: $!"; 
     exec "xargs", "--null", "egrep", "-lZ", 'include[[:space:]]*\(' 
     or die "$0: exec xargs: $!"; 
    } 
    else { 
     exec "find", @ARGV, "-maxdepth", 1, 
          "-name", "*.php", 
          "-print0" 
     or die "$0: exec find: $!"; 
    } 
    } 

    @ARGV = @paths; 
} 

在這一點上,@ARGV可能是空的,如果是的話,我們保釋。

unless (@ARGV) { 
    warn "$0: nothing to do\n"; 
    exit 1; 
} 

否則,我們模仿-i開關,它必須經過<>print的處理。該代碼至少會警告文件系統的空間不足,而不是靜靜地失敗。

# $^I = ""; # no backup 
$^I = ".bak"; 

while (<>) { 
    s/include\s*\(/include_once(/g; 
    print; 
} 
continue { 
    if (eof) { 
    close ARGV or warn "$0: close $ARGV: $!\n"; 
    } 
} 

採樣運行:

$ ./fixinc 

$ ls *.php 
bar.php baz.php foo.php 

$ ls *.bak 
bar.php.bak foo.php.bak 

$ diff -ub foo.php.bak foo.php 
--- foo.php.bak 
+++ foo.php 
@@ -1 +1 @@ 
-include(foo) 
+include_once(foo) 

$ diff -ub bar.php.bak bar.php 
--- bar.php.bak 
+++ bar.php 
@@ -1 +1 @@ 
-include (bar) 
+include_once(bar)