Perl

grep 參數列表太長

  • July 14, 2017

通常要在選擇的文件中搜尋和替換字元串,我會找到:

grep -rl 'pattern' .

除非您有很多匹配項,否則這很好用。

無論如何,我環顧四周,發現了一個使用的建議find

find /root/path -type f -exec grep -l 'FIND' {} +

這工作正常,但是當我嘗試將其傳遞給 Perl 進行替換時,我仍然得到錯誤:

perl -p -i -e 's|FIND|REPLACE|g' `find /root/path -type f -exec grep -l 'FIND' {} +`

-bash: /usr/local/bin/perl: Argument list too long

有沒有辦法解決?

正如人們所建議的那樣,我需要編寫一個小腳本來為我做魔法:)

對我來說,我有很多文件——所以為了幫助加快速度(並使find伺服器上的文件更好一點),我將我的文件分成多個程序來處理更大的文件夾。所以腳本是:

#!/usr/bin/perl

my $find = q|string-to-find|;
my $replace = q|replace-with|;

my @paths = split /\n/, q|/home/user/folder1
/home/user/folder2
/home/user/folder3
/home/user/folder4|;

my $debug = 1;

foreach my $path (@paths) {
   my @files = split /\n/, `find $path -type f -exec grep -l '$find' {} +`;

   foreach (@files) {
       chomp;
       if (-f $_) {
           print qq|Doing $_\n| if $debug > 0;
           `sed -i 's/$find/$replace/g' $_`
       }

   }

}

然後只需從 SSH 執行它:

perl script-name.cgi

引用自:https://serverfault.com/questions/861994