bfl*_*nce 3 python linux directory backup gunzip
我刚刚开始学习python并且有一个问题.
如何创建一个脚本来执行以下操作:(将在bash中写下我是如何做到的)
<file>.gz从远程server1 复制到本地存储.
cp /dumps/server1/file1.gz/local /
然后在本地提取该文件.
gunzip /local/file1.gz
然后将提取文件复制到远程server2(用于存档和重复数据删除)
cp /local/file1.dump/dedupmount
删除.gz文件的本地副本以释放"临时"存储空间
rm -rf /local/file1.gz
我需要在循环中运行所有文件.所有文件和目录都安装在同一台服务器上.
for循环遍历/dump/文件夹并查找.gz文件.每个.gz文件将首先复制到/local目录,然后在那里提取.解压缩后,解压缩的.dmp文件将被复制到/dedupmount文件夹进行存档.
只是把我的头撞在墙上如何写这个.
Joh*_*024 16
虽然shell代码可能更短,但整个过程可以在python中本地完成.python解决方案的关键点是:
使用该gzip模块,gzip压缩文件与普通文件一样易于阅读.
要获取源文件列表,请使用该glob模块.它以shell glob功能为模型.
要操纵路径,请使用python os.path模块.它为文件系统提供与OS无关的接口.
这是示例代码:
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)
Run Code Online (Sandbox Code Playgroud)
此代码从remote1服务器读取并写入remote2服务器.除非您需要,否则不需要本地副本.
在此代码中,所有解压缩都由本地计算机上的CPU完成.
为了比较,这里是等效的shell代码:
for src in /dumps/server1/*.gz
do
base=${src##*/}
dest="/dedupmount/${base%.gz}"
zcat "$src" >"$dest"
done
Run Code Online (Sandbox Code Playgroud)
这种稍微复杂的方法实现了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)
Run Code Online (Sandbox Code Playgroud)
这tmpfile会将源文件复制到本地计算机上的临时文件,然后将其从那里压缩到目标文件. tmpfile每次调用此脚本都会被覆盖.
临时文件可能是安全问题.要避免这种情况,请将临时文件放在只能由运行此脚本的用户编写的目录中.