我想知道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
目录中创建整个目录结构,但这可能是开销。
答案 0 :(得分:1)
我终于想出了以下代码。它的行为几乎与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
可能有更好的方法来解决这个问题,但它确实有效。
答案 1 :(得分:0)
不确定您的具体要求,但shutil.copytree
之类的声音适合您。您可以看到完整的文档here,但基本上您需要在示例中调用的内容类似于
shutil.copytree( 'a/b/c', 'existing_dir/a/b/c' )
答案 2 :(得分: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)
答案 3 :(得分:0)
仅3.6或更高(使用f函数)
这是我实施的cp --parents
首先获取获取src目录和文件名的偏移量,以及目录偏移量(有时我想省略src文件的第一个文件夹)
然后它提取文件夹和文件名(src_dirs中的检查是因为我注意到当src文件没有嵌套在它崩溃的任何文件夹中时)
最后,它将目录树创建到目标文件夹中并将文件复制到其中
def __copy_parents(src, dest_folder, dir_offset=0):
''' Copies src tree into dest, offset (optional) omits n folders of the src path'''
prev_offset = 0 if dir_offset == 0 else src.replace('/', '%', dir_offset - 1).find('/') + 1
post_offset = src.rfind('/')
src_dirs = '' if post_offset == -1 else src[prev_offset:post_offset]
src_filename = src[post_offset + 1:]
os.makedirs(f'{dest_folder}/{src_dirs}', exist_ok=True)
shutil.copy(src, f'{dest_folder}/{src_dirs}/{src_filename}')