obtenga el comando Perl de la línea de comando para informar qué cambios se realizaron

obtenga el comando Perl de la línea de comando para informar qué cambios se realizaron

Estoy usando el siguiente comando (en Solaris) para eliminar el protocolo de varios archivos.

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

¿Hay alguna manera de tener una salida detallada para poder obtener un informe de qué archivos se han editado?

Gracias, andy

Respuesta1

Podrías obtener un recuento de sustituciones por archivo con:

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

Tenga en cuenta que en esa y en su solución original, perlse reescribirán los archivos independientemente de si los sustituye o no.

No lo use ;para terminar el -execcomando. perlPuede manejar varios archivos a la vez, no es necesario llamar a un Perl por archivo.

Si solo desea esa salida sin realizar las sustituciones, simplemente reemplácela -picon -nen el comando anterior.

También puedes hacer:

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

Para obtener un recuento delíneasque contiene http(no necesariamente el mismo que el número de httpapariciones).

Respuesta2

Puede obtener un informe de qué archivos se envían a Perl utilizando ambos -printy -exec:

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

Si desea saber qué archivos se modificaron, entonces 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"' _ '{}' \;

información relacionada