Python rclone проверяет разницу двух папок
Я пытаюсь написать автоматический скрипт для загрузки в gdrive с помощью rclone. Я не буду рассматривать весь код только в этом операторе проверки, команда rclone проверяет файлы из локальной папки и смонтированной папки примерно так: rclone check "локальная папка" "смонтированная папка" - игнорировать существующие - только в любом случае она возвращается в терминал некоторые данные, которые не могут быть сохранены в текстовом файле, или я не знаю как сейчас.
def upload_check():
print(" check if all files are uploaded ")
global Error_upload
if :#I stuck here, rclone check and return true or false if all files are uploaded by name and size
Error_upload = True
return Error_upload
print("Not uploaded ")#---------------------------
else:# all good
Error_upload = False
return Error_upload
print("all files are online")#---------------------------
мой вопрос: как правильно проверить два каталога, если они идентичны по всем файлам внутри и по размеру файлов, и вернуть логическое значение True или False?
1 ответ
Через несколько дней я пришел к следующему сложному решению:
import shutil
import os
local = "Local/"
destination = "uploaded/"
checkfile = "logfile.txt"
def upload_check():
print(" check if all files are uploaded ")
global Error_upload
os.system("rclone check 'Local' 'gdrive' --one-way -vv -P --combined logfile.txt")
destination = "uploaded/"
checkfile = "logfile.txt"
search = "=" # move from the folder successfuly uplouded files
list_of_files = []
lines = []
folders = []
uniq_folder_list = []
shutil_l = []
shutil_f = []
for line in open(checkfile, "r"):
if search in line:
list_of_files = line.split("/")[1]
lines.append(list_of_files.rstrip())
list_of_folders = line.split(" ")[1].split("/")[0]
folders.append(list_of_folders.rstrip())
[uniq_folder_list.append(n) for n in folders if n not in uniq_folder_list]
for new_folder in uniq_folder_list:
if not os.path.exists(destination + new_folder):
os.makedirs(destination + new_folder)
for l, f in zip(lines, folders):
l1 = (local + f + "/" + l)
f1 = (destination + f)
shutil_l.append(l1.rstrip())
shutil_f.append(f1.rstrip())
for src, dest in zip(shutil_l, shutil_f):
shutil.move(src,dest)
os.system("rclone check 'Local' 'gdrive' --one-way -vv -P --combined logfile.txt")
with open(checkfile, 'r') as read_obj:
one_char = read_obj.read(1)
if not one_char:
Error_upload = False
return Error_upload
print("all files are online")
else:
Error_upload = True
return Error_upload
print("Not uploaded ")
Сначала я создал несколько файлов и несколько из них загрузили их на диск, также один поврежденный файл. Чем этот скрипт сделает свою работу. Файл logfile.txt содержит список, созданный с помощью rclone
rclone проверьте 'Local' 'gdrive' --one-way -vv -P --combined logfile.txt
эта команда bash сгенерирует файл журнала:
+ 20_10_10/IMG_1301-00006.jpg
+ 20_10_10/IMG_1640-00007.jpg
+ 20_10_10/IMG_1640-00008.jpg
+ 20_10_10/IMG_1640-00009.jpg
+ 20_10_10/IMG_1640-00010.jpg
+ 20_10_10/IMG_1640-00011.jpg #missing on remote
* 20_10_10/IMG_1301-00004.jpg #corrupted file
= 20_10_10/IMG_1301-00005.jpg
= 20_10_10/IMG_1301-00003.jpg
= 20_10_10/IMG_1301-00001.jpg
= 20_10_09/IMG_2145-00028.jpg
= 20_10_10/IMG_1301-00002.jpg
больше информации о rclone проверьте справку по rclone. Файлы с "=" идентичны в локальном и удаленном месте назначения, поэтому мы хотим переместить их из исходной папки в загруженную папку.
Сценарий запускается снова, и если функция чтения ничего не может прочитать, все файлы находятся в сети, и функцию загрузки не нужно запускать снова. Но поскольку есть незагруженные файлы и поврежденный файл (это может произойти, если соединение потеряно во время загрузки), скрипт запустит функцию загрузки или любую другую функцию, запускаемую функцией if с переменной "Error_upload"
просто для справки:
if Error_upload == True:
print("All files are on the cloud")
else:
upload() #your upload function
upload_check()
Я точно знаю, что этот код можно было бы упростить и улучшить.