С развитием технологий четкость фотографий и видео, которые мы снимаем в повседневной жизни, продолжает улучшаться, но у этого есть и серьезный недостаток: их размер также становится все больше и больше. Я до сих пор помню, когда я впервые начал пользоваться смартфонами, размер фотографии был всего 2-5MB
, а сейчас размер фотографии достиг 15-20MB
, а то и больше.
Место для хранения на наших мобильных телефонах ограничено. Как создать резервную копию этих фотографий и видео, чтобы освободить место на наших мобильных телефонах?
Итак, вначале я хранил все эти данные в облаке фотоальбома. Хотя проблема хранения этих данных была решена, возникли и новые проблемы, такие как ограничения по размеру загрузки и необходимость все время занимать фон, что привело. к повышенному энергопотреблению, реклама.
Позже я просто перестал им пользоваться и написал скрипт для резервного копирования данных, так и вышла эта статья.
Для создания этого сценария я использовал Node.js
и adb
и назвал его MIB
Этот небольшой инструмент реализован с помощью отладки adb
на мобильном телефоне, чтения информации о файлах и копирования, а также перемещения файлов на мобильном телефоне с помощью команд shell
.
Я нарисовал простую блок MIB
до конца узла.
установите необходимую среду
и загрузите пакет adb
, который используется для выполнения различных операций с устройством.
Загрузите Node.js
Я считаю, что у всех братьев на своих компьютерах уже есть библиотека зависимостей установки fs-extra
:
fs-extra
Node
на основе вторичной инкапсуляции модуля fs
.prompts
: Библиотека Node
для взаимодействия в командной строке.winston
: Библиотека Node
для записи журналов сценариев.Поскольку исходный код проекта слишком велик, мне интересно только основную часть кода
. друзья могут зайти на
github
, чтобы увидеть исходный код проекта. github.com/ QC2168/mib
читает файл конфигурации.
Export const getConfig = (): ConfigType => { если (existConf()) { вернуть readJsonSync (CONFIG_PATH); } // Файл конфигурации не найден return createDefaultConfig(); };
При выполнении скрипта выберите ID
устройства, резервную копию которого необходимо создать. И указать устройство при выполнении команды adb
(async() => { константное устройство: строка | логическое значение = ожидание selectDevice(); если (устройство) MIB(); })(); экспортировать const selectDevice = async ():Promise<string|false> => { // Получаем список констант устройств: devicesType[] = devices(); если (list.length === 0) { log("В настоящее время ни одно устройство не подключено, пожалуйста, подключитесь перед запуском инструмента", "предупреждать"); вернуть ложь; } const result = list.map((i) => ({ title: i.name, value: i.name })); const { значение } = ожидание подсказок({ тип: «выбрать», имя: «значение», сообщение: «пожалуйста, выберите свое устройство», выбор: результат, }); имя_текущего_устройства = значение; вернуть текущее имя_устройства; }После
обхода резервного узла
и выбора устройства введите информацию об узле обхода и выполните копирование файла по указанному пути ( output
атрибут в файле конфигурации)
const MIB = () => {; // Получаем файл конфигурации const { backups, output } = getConfig(); // Определяем, пуст ли резервный узел if (backups.length === 0) { log("Текущий резервный узел пуст", "предупреждать"); log("Пожалуйста, добавьте резервные узлы в файл конфигурации", "предупреждать"); } if (backups. length > 0) { isPath (выход); // Анализируем последнюю папку пути резервного копирования backups.forEach((item: SaveItemType) => { log(`В настоящее время выполняется задача резервного копирования:${item.comment}`); const arr = item.path.split("/").filter((i: string) => i !== ""); const имя_папки = arr.at(-1); const backupDir = pathRepair(item.path); // Каталог резервных копий // Определить, существует ли в узле каталог резервных копий // Соединить путь экспорта const rootPath = pathRepair(pathRepair(output) +folderName); const outputDir = item.output ? item.output && pathRepair(item.output) : корневой путь; // Определяем, существует ли путь резервного копирования if (!isPathAdb(backupDir)) { log(`Путь к резервной копии:${backupDir} не существует и был пропущен`, "ошибка"); } еще { // Определяем путь экспорта isPath(outputDir); резервное копирование (backupDir, выходной каталог, item.full); } }); } log("Программа завершается"); }; // Уточняем файлы, которые необходимо скопировать, и помещаем их в очередь резервного копирования const backup = (target: string, output: string,full: boolean = false) => { если (!full) { // Резервное копирование данных файла, не являющихся резервными копиями // Получите информацию о файле в мобильном телефоне и сравните ее с локальным const { backupQueue } = initData(target, output); // Вычисляем объем и количество ComputeBackupSize(backupQueue); //Выполняем программу резервного копирования move(backupQueue, output); } еще { // Никакого сравнения файлов, прямое резервное копирование moveFolder(target, output); } }; //Перемещение файлов в очереди файлов для резервного копирования const move = (backupQueue: FileNodeType[], outputDir: string): void => { если (backupQueue.length === 0) { log("Резервное копирование не требуется"); возвращаться; } for (const fileN of backupQueue) { log(`Резервное копирование ${fileN.fileName}`); пытаться { const out: строка = execAdb( `pull "${fileN.filePath}" "${outputDir + fileN.fileName}"`, ); const скорость: строка | null = out.match(speedReg) !== null ? out.match(speedReg)![0] : «Не удалось прочитать скорость»; log(`Средняя скорость передачи${speed}`); } поймать (е: любой) { log(`Ошибка резервного копирования ${fileN.fileName}:${e.message}`, "ошибка"); } } };
USB
соединение для резервного копирования данныхвведите следующую команду в терминале, чтобы установить mib
глобально.
.mibrc
файла сценария конфигурации
npm i @qc2168/mib -gвам необходимо создать новый файл .mibrc в каталоге пользователя и установить соответствующее содержимое параметра.
{ "резервные копии": [ { "path": "/sdcard/MIUI/sound_recorder/call_rec", "comment": "Запись разговора" }, { "путь": "/sdcard/DCIM/Камера", "comment": "Местный фотоальбом" }, { "path": "/sdcard/DCIM/Creative", "comment": "Моё творение" }, { "path": "/sdcard/Pictures/weixin", "comment": "Фотоальбом WeChat" }, { "path": "/sdcard/tencent/qq_images", "comment": "Фотоальбом QQ" }, { "path": "/sdcard/Pictures/zhihu", "комментарий": "Чжиху" }, { "path": "/sdcard/tieba", "комментарий": "Тиеба" }, { "path": "/sdcard/DCIM/Скриншоты", "comment": "Скриншот" }, { "path": "/sdcard/DCIM/screenrecorder", "comment": "Запись экрана" }, { "path": "/sdcard/MIUI/sound_recorder", "комментарий": "запись" }, { "path": "/sdcard/MIUI/sound_recorder/app_rec", "comment": "Запись приложения" } ], "output": "E:/backups/MI10PRO" }
Чтобы выполнить резервное копирование
в консоли, введите mib
напрямую, чтобы запустить скрипт, без других параметров.
mib
выведет соответствующую информацию на основе файла конфигурации.
2022-04-09 20:58:11 информация Текущая задача резервного копирования: запись экрана2022-04-09 20:58:11 информация Количество резервных копий 1 2022-04-09 20:58:11 информация Получено 24Мб данных 2022-04-09 20:58:11 размер инфо-бэкапа 24Мб 2022-04-09 20:58:11 информация Резервное копирование Screenrecorder-2022-04-08-19-45-51-836.mp4 2022-04-09 20:58:12 информация средняя скорость передачи 27,7 МБ/с 2022-04-09 20:58:12 информация Текущая задача резервного копирования: запись 2022-04-09 20:58:12 информация Количество резервной копии 0 2022-04-09 20:58:12 размер инфо-бэкапа 0Мб 2022-04-09 20:58:12 информация Резервное копирование не требуется 2022-04-09 20:58:13 информация Программа завершается
Исходный адрес: https://juejin.cn/post/7084889987631710221
Автор: _island