get 命令行 perl 命令来报告它所做的更改

get 命令行 perl 命令来报告它所做的更改

我正在使用以下命令(在 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

-print您可以使用和获取有关发送到 perl 的文件的报告-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"' _ '{}' \;

相关内容