obtenha o comando perl da linha de comando para relatar quais alterações foram feitas

obtenha o comando perl da linha de comando para relatar quais alterações foram feitas

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, perlirá reescrever os arquivos independentemente de fazer substituição neles ou não.

Não use ;para encerrar o -execcomando. perlpode 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 -pipor -nno 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 httpocorrências).

Responder2

Você pode obter um relatório de quais arquivos são enviados para perl usando ambos -printe -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"' _ '{}' \;

informação relacionada