
Я использую следующую команду (в 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"' _ '{}' \;