Python 解决方案
虽然 shell 代码可能更短,但整个过程可以在 python 中本地完成。python解决方案的关键点是:
使用该gzip
模块,gzip 压缩文件与普通文件一样易于阅读。
要获取源文件列表,请glob
使用该模块。它以 shell glob 特性为模型。
要操作路径,请使用 pythonos.path
模块。它为文件系统提供了一个独立于操作系统的接口。
这是示例代码:
import gzip
import glob
import os.path
source_dir = "/dumps/server1"
dest_dir = "/dedupmount"
for src_name in glob.glob(os.path.join(source_dir, '*.gz')):
base = os.path.basename(src_name)
dest_name = os.path.join(dest_dir, base[:-3])
with gzip.open(src_name, 'rb') as infile:
with open(dest_name, 'wb') as outfile:
for line in infile:
outfile.write(line)
此代码从 remote1 服务器读取并写入 remote2 服务器。除非您需要,否则不需要本地副本。
在这段代码中,所有的解压都是由本地机器上的 CPU 完成的。
外壳代码
为了比较,下面是等效的 shell 代码:
for src in /dumps/server1/*.gz
do
base=${src##*/}
dest="/dedupmount/${base%.gz}"
zcat "$src" >"$dest"
done
三步 Python 代码
这种稍微复杂一点的方法实现了 OP 的三步算法,该算法使用本地机器上的临时文件:
import gzip
import glob
import os.path
import shutil
source_dir = "./dumps/server1"
dest_dir = "./dedupmount"
tmpfile = "/tmp/delete.me"
for src_name in glob.glob(os.path.join(source_dir, '*.gz')):
base = os.path.basename(src_name)
dest_name = os.path.join(dest_dir, base[:-3])
shutil.copyfile(src_name, tmpfile)
with gzip.open(tmpfile, 'rb') as infile:
with open(dest_name, 'wb') as outfile:
for line in infile:
outfile.write(line)
这会将源文件复制到本地计算机上的临时文件tmpfile
,然后将其从那里枪压缩到目标文件。 tmpfile
将被此脚本的每次调用覆盖。
临时文件可能是一个安全问题。为避免这种情况,请将临时文件放在只有运行此脚本的用户才能写入的目录中。