
기술의 발전에 따라 우리가 일상에서 촬영하는 사진과 영상의 선명도는 계속해서 향상되고 있지만, 이 역시 크기가 점점 커지고 있다는 큰 단점이 있습니다. 처음 스마트폰을 사용하기 시작했을 때는 사진 한 장의 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