将文件复制到目录,并附加其原始前导目录
我在想,Python有没有一种标准的方法,可以把一个文件复制到某个文件夹里,同时保留它原来的上级目录,就像命令行中的 cp --parents
一样。在 cp
的手册里是这么说的:
`--parents'
[...]
cp --parents a/b/c existing_dir
copies the file `a/b/c' to `existing_dir/a/b/c', creating any
missing intermediate directories.
我在 shutil
的文档里没有看到关于这个的内容。当然,我可以在把文件复制到 existing_dir
之前,先在那个目录下创建完整的目录结构,但这样做可能有点麻烦。
4 个回答
0
这段代码是用来做某个功能的,但具体的功能需要根据上下文来理解。代码块通常包含一些编程指令,可能是用来处理数据、执行计算或者控制程序的流程。
如果你看到这样的代码块,通常意味着这里有一些具体的代码示例,帮助你理解如何实现某个功能。理解这些代码的关键在于逐行分析每一条指令的作用。
总之,代码块是编程中非常重要的一部分,它们帮助我们实现各种功能。只要你慢慢学习,就能掌握这些代码的含义和用法。
import os
import shutil
files = [ '/usr/bin/ls','/etc/passwd' , '/var/log/daily.out' , '/var/log/system.log' , '/var/log/asl/StoreData' ]
def copy_structure(dst_dir,source_files):
if not os.path.exists(dst_dir) and os.path.isdir(dst_dir):
os.mkdir(dst_dir)
for file in source_files:
dir_name = os.path.dirname(file)
final_dir_path = os.path.normpath(dst_dir+dir_name)
if not os.path.exists(final_dir_path):
os.makedirs(final_dir_path)
if os.path.exists(file):
shutil.copy(file,final_dir_path)
copy_structure('/tmp/backup',files)
1
我不太清楚你具体的需求,但听起来 shutil.copytree
可能正好适合你。你可以在 这里 查看完整的文档,不过基本上在你的例子中,你只需要调用类似下面的内容:
shutil.copytree( 'a/b/c', 'existing_dir/a/b/c' )
2
我终于写出了下面这段代码。它的功能几乎和 cp --parents
一样。
import os, shutil
def cp_parents(target_dir, files):
dirs = []
for file in files:
dirs.append(os.path.dirname(file))
dirs.sort(reverse=True)
for i in range(len(dirs)):
if not dirs[i] in dirs[i-1]:
need_dir = os.path.normpath(target_dir + dirs[i])
print("Creating", need_dir )
os.makedirs(need_dir)
for file in files:
dest = os.path.normpath(target_dir + file)
print("Copying %s to %s" % (file, dest))
shutil.copy(file, dest)
你可以这样调用它:
target_dir = '/tmp/dummy'
files = [ '/tmp/dir/file1', '/tmp/dir/subdir/file2', '/tmp/file3' ]
cp_parents(target_dir, files)
输出结果是:
Creating /tmp/dummy/tmp/dir/subdir
Copying /tmp/dir/file1 to /tmp/dummy/tmp/dir/file1
Copying /tmp/dir/subdir/file2 to /tmp/dummy/tmp/dir/subdir/file2
Copying /tmp/file3 to /tmp/dummy/tmp/file3
可能还有更好的方法来处理这个问题,但这个方法是可以用的。