기술의 발전에 따라 우리가 일상에서 촬영하는 사진과 영상의 선명도는 계속해서 향상되고 있지만, 이 역시 크기가 점점 커지고 있다는 큰 단점이 있습니다. 처음 스마트폰을 사용하기 시작했을 때는 사진 한 장의 2-5MB
에 불과했지만 지금은 15-20MB
또는 그보다 더 커진 것을 아직도 기억합니다.
휴대폰의 저장 공간은 제한되어 있습니다. 휴대폰의 공간을 확보하기 위해 이러한 사진과 비디오를 어떻게 백업합니까?
그래서 처음에는 이 모든 데이터를 사진첩 클라우드에 저장했습니다. 이 데이터를 저장하는 문제는 해결되었지만 업로드 크기 제한, 배경을 항상 차지해야 하는 필요성 등 새로운 문제도 등장하여 이로 인해 전력 소비를 증가시킵니다.
나중에는 그냥 사용을 중단하고 데이터를 백업하는 스크립트를 작성해서 이런 글이 나왔습니다.
Node.js
와 adb
사용하여 이 스크립트를 만들고 이름을 MIB
이 작은 도구는 휴대폰에서 adb
디버깅을 사용하고, shell
명령을 통해 휴대폰에서 파일 정보를 읽고 복사하는 방식으로 구현됩니다.
간단한 흐름도 MIB
그려봤습니다
노드 끝까지.
필요한 환경을 설치
하고 다양한 장치 작업을 수행하는 데 사용되는 adb
패키지를 다운로드합니다.
Node.js
다운로드합니다. 모든 형제는 이미 컴퓨터에 설치 종속성 라이브러리인 fs-extra를 가지고 있다고
Node
fs-extra
.
fs
모듈의 보조 캡슐화를 기반으로 합니다.prompts
: 명령줄 상호작용을 위한 Node
라이브러리winston
: 스크립트 로그를 기록하기 위한 Node
라이브러리.프로젝트
소스 코드가 너무 많아서 여기에는 주요 코드 부분만 넣었습니다.
친구들은
github
에 가서 프로젝트 소스 코드를 볼 수 있습니다. github.com/ QC2168/mib는
구성 파일을 읽습니다.
import const getConfig = (): ConfigType => { if (existConf()) { readJsonSync(CONFIG_PATH)를 반환합니다. } // 구성 파일을 찾을 수 없습니다. return createDefaultConfig(); };
스크립트 실행 시 백업해야 할 장치 ID
선택합니다. 그리고 adb
명령 실행 시 장치를 지정합니다
(async() => { const 장치: 문자열 | 부울 = selectDevice()를 기다립니다. if (장치) MIB(); })(); 내보내기 const selectDevice = async ():Promise<string|false> => { // 장치 가져오기 const 목록: devicesType[] = devices(); if (list.length === 0) { log("현재 연결된 장치가 없습니다. 도구를 실행하기 전에 연결하십시오.", "경고"); 거짓을 반환; } const result = list.map((i) => ({ 제목: i.name, 값: i.name })); const { value } = 프롬프트 대기({ 유형: "선택", 이름: "값", 메시지: "기기를 선택하세요", 선택: 결과, }); currentDeviceName = 값; 현재 장치 이름을 반환합니다. };
백업 노드를 순회
하고 장치를 선택한 후 순회 노드 정보를 입력하고 지정된 경로에 파일 복사를 실행합니다. ( 구성 파일의 output
속성)
const MIB = () => { // 구성 파일 가져오기 const { backups, output } = getConfig(); // 백업 노드가 비어 있는지 확인합니다. if (backups.length === 0) { log("현재 백업 노드가 비어 있습니다.", "경고"); log("구성 파일에 백업 노드를 추가하십시오.", "warn"); } 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 출력Dir = item.output ? item.output && 경로 복구(item.output) : 루트 경로; // 백업 경로가 존재하는지 확인합니다. if (!isPathAdb(backupDir)) { log(`백업 경로:${backupDir}이(가) 존재하지 않아 건너뛰었습니다.`, "error"); } 또 다른 { // 내보내기 경로 결정 isPath(outputDir); 백업(backupDir,outputDir,item.full); } }); } log("프로그램이 종료됩니다."); }; // 백업해야 할 파일을 세분화하여 백업 큐에 넣습니다. const backup = (대상: 문자열, 출력: 문자열, 전체: 부울 = false) => { 만약 (!full) { // 백업되지 않은 파일 데이터 백업 // 휴대폰에 있는 파일 정보를 가져와서 로컬과 비교 const {backupQueue } = initData(target,output); // 볼륨과 수량을 계산합니다. ComputeBackupSize(backupQueue); //백업 프로그램 실행 move(backupQueue,output); } 또 다른 { // 파일 비교 없음, 직접 백업 moveFolder(target,output); } }; //백업할 파일 큐의 파일을 이동합니다. const move = (backupQueue: FileNodeType[], outputDir: string): void => { if (backupQueue.length === 0) { log("백업이 필요하지 않습니다."); 반품; } for (backupQueue의 const fileN) { log(`${fileN.fileName} 백업 중`); 노력하다 { const 출력: 문자열 = execAdb( `pull "${fileN.filePath}" "${outputDir + fileN.fileName}"`, ); const 속도: 문자열 | null = out.match(speedReg) !== null ? out.match(speedReg)![0] : "속도를 읽지 못했습니다."; log(`평균 전송 속도${speed}`); } 잡기 (예: 임의) { log(`${fileN.fileName} 백업 실패 오류:${e.message}`, "error"); } }
;
USB
연결터미널에 다음 명령을 입력하여 mib
전역으로 설치합니다.
npm i @qc2168/mib -g
구성 스크립트 파일을
처음 사용하는 경우 사용자 디렉터리에 새 .mibrc
파일을 생성하고 해당 매개변수 내용을 설정해야 합니다.
{ "백업": [ { "경로": "/sdcard/MIUI/sound_recorder/call_rec", "comment": "통화 녹음" }, { "경로": "/sdcard/DCIM/카메라", "comment": "로컬 사진 앨범" }, { "경로": "/sdcard/DCIM/크리에이티브", "comment": "내가 만든 것" }, { "경로": "/sdcard/Pictures/weixin", "comment": "WeChat 사진 앨범" }, { "경로": "/sdcard/tencent/qq_images", "comment": "QQ 사진첩" }, { "경로": "/sdcard/Pictures/zhihu", "comment": "즈후" }, { "경로": "/sdcard/tieba", "comment": "티에바" }, { "경로": "/sdcard/DCIM/스크린샷", "comment": "스크린샷" }, { "경로": "/sdcard/DCIM/screenrecorder", "comment": "화면 녹화" }, { "경로": "/sdcard/MIUI/sound_recorder", "댓글": "녹음" }, { "경로": "/sdcard/MIUI/sound_recorder/app_rec", "comment": "앱 녹화" } ], "출력": "E:/backups/MI10PRO" }
콘솔 mib
백업을 수행하려면
다른 매개변수 없이 mib를 직접 입력하여 스크립트를 트리거합니다.mib
콘솔은 구성 파일을 기반으로 해당 정보를 출력합니다.
2022-04-09 20:58:11 정보 현재 백업 작업 : 화면 녹화2022-04-09 20:58:11 정보 백업 수량 1 2022-04-09 20:58:11 정보 24Mb의 데이터 획득 2022-04-09 20:58:11 정보 백업 크기 24Mb 2022-04-09 20:58:11 정보 Screenrecorder 백업중-2022-04-08-19-45-51-836.mp4 2022-04-09 20:58:12 정보 평균 전송 속도 27.7MB/s 2022-04-09 20:58:12 info 현재 백업 작업: 녹화 2022-04-09 20:58:12 info 백업 수량 0 2022-04-09 20:58:12 정보 백업 크기 0Mb 2022-04-09 20:58:12 정보 백업 불필요 2022-04-09 20:58:13 정보 프로그램 종료
원본 주소 : https://juejin.cn/post/7084889987631710221
작성자 : _island