
Estou usando o seguinte comando (no Solaris) para remover o protocolo de vários arquivos.
find . -name "*.txt" -exec perl -pi -e 's/http//g' '{}' \;
Existe uma maneira de obter uma saída detalhada para que eu possa obter um relatório de quais arquivos foram editados?
Obrigado, Andy
Responder1
Você pode obter uma contagem de substituições por arquivo com:
find . -type f -exec perl -pi -e '
$count{$ARGV} += s/http//g;
END {for (keys %count) {print "$_: $count{$_}\n" if $count{$_}}}' {} +
Observe que nisso e na sua solução original, perl
irá reescrever os arquivos independentemente de fazer substituição neles ou não.
Não use ;
para encerrar o -exec
comando. perl
pode lidar com vários arquivos ao mesmo tempo, sem necessidade de chamar um perl por arquivo.
Se você deseja apenas essa saída sem realmente fazer as substituições, basta substituir -pi
por -n
no comando acima.
Você também pode fazer:
find . -type f -exec grep -c http /dev/null {} +
Para obter uma contagem delinhascontendo http
(não necessariamente igual ao número de http
ocorrências).
Responder2
Você pode obter um relatório de quais arquivos são enviados para perl usando ambos -print
e -exec
:
find . -name "*.txt" -print -exec perl -pi -e 's/http//g' '{}' \;
Se você quiser descobrir quais arquivos foram modificados, algo como
find . -name "*.txt" \
-exec perl -i.bak -pe 's/http//g' '{}' \; \
-exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;