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

1

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 ter uma saída detalhada para que eu possa obter um relatório de quais arquivos foram editados?

Obrigado Andy

    
por user2609641 06.11.2015 / 17:21

2 respostas

3

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, nessa e na sua solução original, perl reescreverá os arquivos, independentemente de fazer ou não substituições.

Não use ; para finalizar o comando -exec . perl pode manipular vários arquivos por vez, não é necessário chamar um perl por arquivo.

Se você quiser apenas a 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 de linhas contendo http (não necessariamente o mesmo que o número de http ocorrências).

    
por 06.11.2015 / 17:32
1

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

Tags