Как я неправильно использую copytree и как я могу это исправить, чтобы он не попал в огромный цикл?
Я пытаюсь сделать функцию, которая копирует все каталоги и файлы и помещает их в папку. В этом каталоге нет папки для резервных копий, поэтому при первом создании я использую дерево копий, и каждый раз, когда вы перезапускаете эту программу, она должна выполнять резервное копирование снова (включая архивную копию). У меня проблема с копирайтом, попавшим в огромный рекурсивный цикл, и я не знаю, что я делаю неправильно. Вот мой код Это работает в первый раз, но когда я запускаю это во второй раз, это портит. argv[1] - это локальная папка, которую вы хотите сделать резервную копию. Это будет работать как:
% python3 имя файла
from os import path, walk, remove, mkdir, listdir
from sys import argv
from shutil import copytree
if path.exists(argv[1]+'/Versions'):
copytree(argv[1], argv[1]+ '/Versions/' + str((len(listdir(argv[1]+'/Versions')))+1))
else:
copytree(argv[1], argv[1]+'/Versions/1')
Если папка "Версии" уже существует, она подсчитывает количество подпапок и создает новую папку с ее меткой +1 к числу имеющихся папок.
1 ответ
Мне кажется, вы создаете резервную копию в подпапке папки, для которой вы создаете резервную копию.
Поэтому при следующем запуске сценария вы создаете резервную копию резервной копии, а затем резервную копию резервной копии и т. Д.
Поместите резервную копию в папку, которая не является подпапкой исходных данных, и ваш сценарий должен работать.
source_path = os.path.join(argv[1], '/Versions')
destination_path = os.path.join(argv[1], '..', '/Backup')
#Now handle copying between these two locations
...
Использование метода игнорирования
Кроме того, вы можете передать в вызываемую copytree
игнорировать определенные каталоги.
from shutil import copytree, ignore_patterns
copytree(source_path, destination_path, ignore=ignore_patterns('Versions'))