我相信这已经接近你将要做的最好的事情了(bash):
MYHEADER=/path/to/the/header
HEADERSIZE=$(stat --format %s "$MYHEADER")
for FILENAME in $FILES; do
OLDSIZE=$(stat --format %s "$FILENAME")
cat "$MYHEADER" "$FILENAME" > /tmp/headerize.tmp
NEWSIZE=$(stat --format %s /tmp/headerize.tmp)
EXPECTEDSIZE=$(($HEADERSIZE+$OLDSIZE))
if [ "$NEWSIZE" -eq "$EXPECTEDSIZE" ]; then
mv /tmp/headerize.tmp "$FILENAME"
else
echo "Something odd happened when processing $FILENAME, headerization skipped for this file."
fi
done
除非你有一个非常可悲的系统或太长的时间标准太高,否则应该在适当的时间内完成。它包括错误检查。
当然,您应该确保您的标题以换行符结尾,否则最后的标题行和第一个文本文件行将合并。
这里唯一剩下的优化就是保证临时文件和原始文件写入同一个文件系统;这可能会加快 mv 命令的速度。
一般来说,内容插入很慢。无论是在内存中还是在磁盘上,都是如此。我相信您将永远找不到恒定时间解决方案。但是,您可能实际上并不需要一个用于一次性批处理作业。
这是 IMO 在 Python 中最快的实现。由于它不会创建临时文件,因此它可能比 bash 版本更快:
MYHEADERPATH=/path/to/the/header
with open(MYHEADERPATH, 'r') as f:
header = f.read()
for filename in files:
with open(filename, 'r') as f:
content = f.read()
with open(filename, 'w') as f:
f.write(header + content)
但是,如果您希望它严格安全,则必须以与 bash 脚本相同的方式执行此操作,因此最终速度差异可能很小。