2

我想知道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

4 回答 4

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

可能有更好的方法来处理这个问题,但它确实有效。

于 2013-03-11T14:01:19.483 回答
0

不确定您的具体要求,但听起来shutil.copytree适合您。您可以在此处查看完整的文档,但基本上您在示例中需要调用的内容类似于

shutil.copytree( 'a/b/c', 'existing_dir/a/b/c' )
于 2013-03-11T00:28:07.093 回答
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)  
于 2017-10-02T17:01:59.907 回答
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}')
于 2018-02-21T20:15:04.383 回答