【发布时间】:2011-10-20 21:19:12
【问题描述】:
我们的任务是将二进制文件中的一些字符串更改为小写(从混合/大写/随便)。相关字符串是对其他文件的引用(它与升级有关,我们也从 Windows 迁移到 linux 作为服务器环境,所以情况突然变得很重要)。我们编写了一个脚本,它使用 perl 循环来执行此操作。我们有一个包含大约 300 个文件的目录(目录的总大小约为 150M),所以它是一些数据,但不是很大。
下面的 perl 代码大约需要 6 分钟来完成这项工作:
for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'`
do
(( updated++ ))
write_line "Converting case of string: $file_ref "
perl -i -pe "s{(?i)$file_ref}{$file_ref}g" $forms6_convert_dir/*
done
而下面的 perl 代码需要 3 个多小时!
for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'`
do
(( updated++ ))
write_line "Converting case of string: $file_ref "
perl -i -pe 's{(?i)$file_ref}{$file_ref}g' $forms6_convert_dir/*
done
谁能解释为什么?是否 $file_ref 被保留为字符串 $file_ref 而不是用单引号版本中的值替换?在这种情况下,它在这个版本中取代了什么?我们想要的是用它自己替换所有出现的任何文件名,但要小写。如果我们在之前和之后的文件上运行字符串并搜索文件名,那么两者似乎都进行了相同的更改。但是,如果我们对两个循环生成的文件运行 diff(diff firstloop/file1 secondloop/file1),那么它会报告它们不同。
这是在 linux 上的 bash 脚本中运行的。
【问题讨论】: