Назад | Перейти на главную страницу

Слишком длинный список аргументов с grep

Обычно для поиска и замены строки в выбранных файлах я бы нашел:

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