将文件复制到目录,并附加其原始前导目录

4 投票
4 回答
3534 浏览
提问于 2025-04-17 18:37

我在想,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

可能还有更好的方法来处理这个问题,但这个方法是可以用的。

撰写回答