文件夹大小已达到限制?

文件夹大小已达到限制?

我有一个 Python 脚本,可以将一个非常大的文件夹(109.05 GB,包含分布在子文件夹中的 13.071 个项目)中的文件从外部硬盘复制到另一个硬盘。

我使用的脚本没有引发任何异常。不幸的是,当我查看目标文件夹时,它只有(6.563 个项目,总计 58.8 GB),它应该具有与源文件夹相同的大小并包含与源文件夹一样多的文件...

我搜索的每个文件似乎都已转移。

我的问题是:这是显示错误吗?还是真的存在文件夹大小限制,并且某些文件可能已被隐式覆盖?

对于那些了解一些 Python 的人来说,这是一个简单的脚本,我在这里加入它:

source_dir = r'/media/julien/Elements/Ma Musique'
dest_dir = r'/media/julien/TOSHIBA EXT/All my music'

def copy_all_files(source_dir,destination_dir):
    for root, subdirs, files in os.walk(source_dir):
        for file in files:
            path = os.path.join(root, file)
            print (path.encode("utf-8"))
            shutil.copy2(path, destination_dir) 


copy_all_files(source_dir,dest_dir)
print("DONE")

答案1

无论文件来自哪个原始子目录,仅会复制其中一个具有重复名称的文件。

执行期间:

所有文件确实被复制,但目标目录中与源名称相同的文件将毫无例外地被覆盖。因此,只有最后复制的文件会保留在目标目录中。

请阅读此处:

Shutil — 高级文件操作

如果 dst 是一个目录,则会在指定的目录中创建(或覆盖)一个与 src 具有相同基本名称的文件

这并不意味着所有不同的文件都会被复制。如果多个文件内容不同但名称相同,则无论文件内容有何差异,都只会复制一个文件。

要查看执行代码时发生的情况,请运行以下修改后的版本:

import os
import shutil
from termcolor import colored

source_dir = r'/media/julien/Elements/Ma Musique'
dest_dir = r'/media/julien/TOSHIBA EXT/All my music'

def copy_all_files(source_dir,destination_dir):
    failed = 0
    succeeded = 0
    for root, subdirs, files in os.walk(source_dir):
        for file in files:
            path = os.path.join(root, file)
            if os.path.exists(destination_dir + '/' + file):
                print(file + colored(' from ', 'yellow') + root + colored(' filename already exist, cannot copy', 'red'))
                # Normally destination files will be overwritten without exception, but now an error message is printed instead
                failed += 1
            else:
                shutil.copy2(path, destination_dir)
                print(file + colored(' from ', 'yellow') + root + colored(' copied successfully', 'green'))
                succeeded += 1
    print(colored('copied files ', 'green') + str(succeeded))
    print(colored('duplicate not copied files ', 'red') + str(failed))



copy_all_files(source_dir,dest_dir)
print("DONE")

回答你的问题:

我的问题是:这是显示错误吗?还是真的存在文件夹大小限制,并且某些文件可能已被隐式覆盖?

看起来源磁盘中不同子目录下有具有相同文件名的不同文件,例如:

文件 1/media/julien/Elements/Ma Musique/audio/book1.mp3

文件 2/media/julien/Elements/Ma Musique/audio_books/book1.mp3

当它们被复制到目标磁盘时,它们都会进入同一个目录(子目录结构是不是保存在您的代码中),因此会发生以下情况:

第一的:文件 1 被复制,因此目标目录将如下所示:

`/media/julien/TOSHIBA EXT/All my music/book1.mp3`

然后:文件 2 被复制,因此shutil.copy2()覆盖文件 1在目标目录中,文件book1.mp3名为文件 2具有相同的文件名,最终目标目录如下所示:

`/media/julien/TOSHIBA EXT/All my music/book1.mp3`

我希望现在已经清楚了。

相关内容