найти: отсутствует аргумент `-exec 'в скрипте perl - PullRequest
3 голосов
/ 30 декабря 2011

Я знаю, что было много вопросов, похожих на мою маленькую проблему. Некоторые исправлены с помощью -exec, но это не то, что мне нужно. Может быть, я просто не вижу, где моя проблема на самом деле ...

Я хочу анонимизировать все IP-адреса в html-файлах в выводе моей аналитики блога:

#!/usr/bin/perl
use warnings;
use strict;
use readPathsFromConf;

system ("find $readPathsFromConf::WWWPATH$readPathsFromConf::WWWSUBDIR -type f -name \"\*\" -exec sed -i '' 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/anonymisiert/g' \{\} \;");

я только получаю

find: missing argument to `-exec'

Я получаю нужные файлы на STDOUT, когда набираю это в командной строке:

find /var/www/statistics/ -type f -name "*"

но как только я добавлю exec-часть, я получу ошибку.

Что-то не так с Escape-персонажами? Что мне не хватает? (Прошу прощения за мой английский)

Ответы [ 4 ]

3 голосов
/ 30 декабря 2011

Вы должны избегать кавычек и обратной косой черты, встроенных в строку:

system ("find /var/www/statistics/ -type f -name \"*\" -exec sed -i 's/\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}/anonymousIP/g' {} \\;");

Также обратите внимание, что на некоторых платформах (например, Mac OS X) для параметра sed -i требуется аргумент - расширение файла резервной копии.

3 голосов
/ 30 декабря 2011

Perl имеет очень хороший File :: Find основной модуль. Нет необходимости вызывать внешнюю утилиту для использования find .

Существует даже вспомогательный скрипт с именем find2perl , который может помочь вам перейти от использования поиска оболочки к Perl. Это обсуждается в ссылке выше.

1 голос
/ 30 декабря 2011

Это должно работать -

#!/usr/bin/perl

use warnings;
use strict;

system ("find /var/www/statistics/ -type f -name \"*\" -exec sed -i 's/\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}/anonymousIP/g' {} +");
1 голос
/ 30 декабря 2011

Потому что в:

system ("find /var/www/statistics/ -type f -name "*" -exec sed -i 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/anonymousIP/g' {} \;");

Двойные кавычки вокруг звездочки не экранированы.Таким образом, интерпретатор считает, что вы умножаете две вещи, и автоматически преобразует каждую из строк в 0 (кстати, именно поэтому вы не используете == для сравнения строк в Perl).

Например, однострочник

perl -e 'use strict;use warnings;my $a="abc";my $b="def";my $c=$a*$b;print "$c\n";'

производит вывод

Argument "def" isn't numeric in multiplication (*) at -e line 1.
Argument "abc" isn't numeric in multiplication (*) at -e line 1.
0

Поскольку у вас включены strict и warnings, вы также должны были видеть аналогичные предупреждения дляприведенные выше.

Более важно, однако: если ваш скрипт состоит из вызова system, почему бы просто не запустить аргумент для system непосредственно в командной строке?

...