У меня есть сценарий Python, который копирует файлы из очень большой папки (109,05 ГБ, которая содержит разбросанные по подпапкам, 13,071 элементов) с внешнего HD на другой.
Сценарий, который я использовал, не вызвал исключений. К сожалению, когда я смотрю на папку назначения, она имеет только (6,563 элемента, общим объемом 58,8 ГБ), она должна иметь такой же размер и содержать столько же файлов, сколько и исходная ...
Каждый файл Я ищу, кажется, были перенесены жестко.
Мой вопрос: это ошибка дисплея? Или действительно ли существует ограничение размера папки, и некоторые файлы могли быть явно перезаписаны?
Для тех из вас, кто немного знает 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")
Только один из файлов, которые имеют двойные названия, копируется, независимо от которого исходного подкаталога они произошли из.
Во время выполнения:
Все файлы действительно копируются, но файлы в целевом каталоге с идентичным именем как источник будут перезаписаны без исключения. Таким образом, только последний скопированный файл останется в целевом каталоге.
Чтение здесь:
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`
Я надеюсь, что Это ясно теперь.