Python rclone проверяет разницу двух папок

Я пытаюсь написать автоматический скрипт для загрузки на gdrive с помощью rclone. Я не буду проходить весь код только в этом операторе проверки, команда rclone проверяет файлы из локальной папки и смонтированной папки примерно так: не может быть сохранен в текстовом файле, или я не знаю, как это сделать.

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?


person Diego Martinčić    schedule 12.10.2020    source источник
comment
вам, вероятно, потребуется использовать одну из библиотек Python для rclone, например python-rclone. В целом Python предоставляет большую экосистему для множества функций через сервер пакетов PyPi.   -  person tuned    schedule 12.10.2020


Ответы (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 check '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()
    

Я точно знаю, что этот код можно было бы упростить и улучшить.

person Diego Martinčić    schedule 14.10.2020