Обычно для поиска и замены строки в выбранных файлах я бы нашел:
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