我正在使用以下命令(在 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"' _ '{}' \;