получить команду командной строки perl, чтобы сообщить, какие изменения были сделаны

получить команду командной строки perl, чтобы сообщить, какие изменения были сделаны

Я использую следующую команду (в Solaris) для удаления протокола из группы файлов.

find .  -name "*.txt"  -exec perl -pi  -e 's/http//g' '{}' \;

Есть ли способ получить подробный вывод, чтобы я мог получить отчет о том, какие файлы были отредактированы?

Спасибо, Энди.

решение1

Вы можете получить количество замен в файле с помощью:

find . -type f -exec perl -pi -e '
    $count{$ARGV} += s/http//g;
    END {for (keys %count) {print "$_: $count{$_}\n" if $count{$_}}}' {} +

Обратите внимание, что в этом и в вашем исходном решении perlфайлы будут перезаписаны независимо от того, выполняется ли в них замена или нет.

Не используйте ;для завершения -execкоманды. perlМожет обрабатывать несколько файлов одновременно, нет необходимости вызывать один perl для каждого файла.

Если вам нужен только этот вывод без фактического выполнения замен, просто замените -piна -nв команде выше.

Вы также можете сделать:

find . -type f -exec grep -c http /dev/null {} +

Чтобы получить количестволиниисодержащий http(не обязательно совпадающий с числом httpвхождений).

решение2

Вы можете получить отчет о том, какие файлы отправлены в Perl, используя -printи -exec:

find .  -name "*.txt" -print -exec perl -pi  -e 's/http//g' '{}' \;

Если вы хотите узнать, какие файлы были изменены, то сделайте что-то вроде

find .  -name "*.txt" \
    -exec perl -i.bak -pe 's/http//g' '{}' \; \
    -exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;

Связанный контент