Tip/BaiduCloud

바이두 클라우드 파일 목록 받아서 중복 찾기

확인소장 2015. 6. 23. 00:43

안녕하세요.

저번에 댓글로 바이두 클라우드의 파일 목록을 받고 싶다는 질문이 있었습니다.

바이두 자체적으로는 그런 서비스를 제공하지 않는것 같습니다.

혹시 제공하고 있다면 댓글로 제보해주시면 감사하겠습니다.


아래의 설명은 4.6.4 버전 기준입니다! (5.2.7버전에서도 가능하게 수정함)

바이두 클라우드 웹하드 버전의 경우 클라우드 내 파일과 폴더 목록을 BaiduYunGuanjia.db 파일로 저장합니다.

이 파일은 Sqlite3 형식의 데이타베이스 파일입니다.

위치는 바이두 클라우드 웹하드 버전이 설치된 폴더의 Users 폴더에 가보면 로그인했던 아이디별로 폴더가 생성되어있습니다.

그 폴더에 들어가면 BaiduYunGuanjia.db 파일이 있습니다.

(4.6.4버전은 BaiduYunGuanjia.db 파일이고 최신 버전들은 BaiduYunCacheFileV0.db 입니다.)


최근의 목록을 위해 우선 클라우드를 실행 후 로그인하고 새로 고침을 한번 해주면 최근 목록이 db로 저장이 됩니다.

이제 이 db 파일을 sqlite3 툴로 쿼리로 읽어들이면 됩니다.


이 작업을 간편하게 하기 위해 오토핫키(Autohotkey)를 이용했습니다.

오토핫키는 스크립트 언어입니다.

dll 방식으로 하려다가 내공이 딸려서 그냥 exe 파일을 이용해서 만들었습니다.

오토핫키를 exe 컴파일하면 여러 백신에서 바이러스로 검진을 해서 그냥 스크립트로 올립니다.

http://ahkscript.org/download/ahk-install.exe

여기서 오토핫키 인스톨 파일을 받아 설치후 .ahk 파일을 실행하면 됩니다.


BaiduDBexport.ahk를 더블클릭하여 실행한 화면입니다.


DB파일을 드래그 앤 드롭으로 끌어다 놓으면 경로 설정이 됩니다.

BaiduYunGuanjia.db는 바이두 실행 파일이 있는 폴더의 하위 Users폴더 내 아이디 폴더 안에 있습니다.

폴더 선택도 마찬가지로 폴더를 끌어다 놓으면 되고, 아니면 폴더 선택 버튼을 눌러 폴더를 지정하면 됩니다.

폴더를 지정하지 않으면 스크립트가 실행된 폴더가 작업폴더가 됩니다.


추출이 성공되면 추출 성공! 메시지가 뜨고 년월일시분초 숫자로 된 이름의 파일이 생성됩니다.

CSV,List,Tab,칼럼 4 종류로 추출이 가능합니다.

CSV는 구분 표시가 ","

List는 구분 표시가 "|"

Tab은 구분표시가 "탭키"

칼럼은 대략적인 표로 표시됩니다.


CSV를 오피스로 엽니다.

그리고 A열을 선택하고


홈 → 조건부 서식 → 셀 강조 규칙(H) → 중복 값(D)


강조 색상을 선택 후 확인


이렇게 중복된 파일이 표시됩니다.

md5는 암호화 해시 함수(위키)로 파일 고유값입니다.

파일 이름이 틀려도 이 MD5값이 같다면 동일 파일입니다.



스크립트 파일이므로 여러분이 필요하다면 수정해서 사용하시면 됩니다.

다운로드

BaiduDBexport.zip


정리하자면

  1. AutoHotKey_L 버전 다운로드 후 설치
  2. BaiduDBexport.zip 파일 다운로드 후 압축해제
  3. BaiduDBexport.ahk 실행
  4. BaiduYunGuanjia.db 파일에서 파일 목록 추출
  5. 오피스(엑셀)에서 중복 찾기


이것도 바이두에서 중복 파일을 찾고 제거해주는 기능을 추가하면 쓸모없어질 포스트입니다만 일단 필요하신 분들을 위해 올립니다.


아래는 AutoHotKey 스크립트 소스 코드입니다.

추가 참고 사항

sql 쿼리 부분을

이렇게 고치면 md5 값이 중복인것만 뽑아서 저장합니다.


#SingleInstance force
#Persistent
#NoEnv
FileEncoding, UTF-8-RAW
global query:= A_Temp . "\baidu.sql"
global sqlite3 := A_WorkingDir "\sqlite3.exe"
dbFile:=
Folder:=
IfNotExist, %sqlite3%
{
	MsgBox, sqlite3.exe 파일이 없습니다.
	return
}
gosub, Gui
return

Gui:
	Gui, add, text, w250, DB파일을 놓으세요 (BaiduYunGuanjia.db)
	Gui, add, edit, xs w250 vcmd_name1 section, 파일 이름
	Gui, add, edit, xs w250 vcmd_path1, DB파일 경로	
	Gui, add, button, xs w100 gSelFolder,폴더 선택
	Gui, add, text, xp+120 w130 yp+6 , 생성할 폴더 설정
	Gui, add, edit, xs w250 vcmd_path2, 생성할 파일 경로	
	Gui, add, DDL, xs+190 w60 vPatt gSelDDL AltSubmit,CSV||`List|`TAB|칼럼
	Gui, add, text, xp-190 w190 yp+5, 생성할 파일 종류를 선택하세요
	Gui, add, edit, xs w250 r5 vmatch,
	Gui, add, button, xs w100 vRun,실행
	Gui, add, button, xp+150  w100 vReset,초기화
	Gui, show
	gosub, selDDL
return

SelDDL:
GuiControlGet, ddlVar,,Patt
if ( ddlVar = 1 )
	mode:="csv"
if ( ddlVar = 2 )
	mode:="list"
if ( ddlVar = 3 )
	mode:="tabs"
if ( ddlVar = 4 )
	mode:="column"

sql := ".header on`n"
sql .= ".mode " mode
sql .= "`nselect md5,file_size,server_filename,server_path from cache_file where md5>0 order by file_size asc;"
GuiControl,,match,%sql%
return

SelFolder:
	FileSelectFolder, Folder
	Folder := RegExReplace(Folder, "\\$")
	GuiControl,,cmd_path2,%Folder%
	gosub, SelDDL
return

parse_cmd:
	Loop , parse, parameter, `r`n
	{
		if ( drop = "cmd_path1" or drop = "cmd_name1" ){
			dbFile = %A_LoopField%
		}else if ( drop = "cmd_path2" or drop = "cmd_name2" ){
			Folder := RegExReplace(A_LoopField, "\\$")		
		}else{
			ToolTip, 정확한 위치에 놓으세요.
			Sleep,1000
			ToolTip
		}
		dropfile_path:=A_LoopField
		StringRight, num,drop,1
		SplitPath ,dropfile_path, ,,,dropfile_name
		GuiControl  ,,cmd_name%num%, %dropfile_name%
		GuiControl  ,,cmd_path%num%, %dropfile_path%
	 Break
	}
	gosub, SelDDL
return

Action:
IfExist, %query%
	FileDelete, %query%
FileAppend, %sql%, %query%
if ( mode = "csv" )
	OutputFile := Folder "\" A_Now "." mode
else
	OutputFile := Folder "\" A_Now ".txt"
cmd := sqlite3 " """ dbFile """  < """ query """ > """ OutputFile """"
RunWait, %ComSpec% /c %cmd%, , Hide UseErrorLevel
if (Errorlevel) {
	FileRead, tempQuery, %query%
	newQuery := RegExReplace(tempQuery,"server_path","parent_path")
	FileDelete, %query%
	FileAppend, %newQuery%, %query%
	RunWait, %ComSpec% /c %cmd%, , Hide UseErrorLevel
	if ( ErrorLevel ){
		FileDelete, %OutputFile%
		MsgBox, 추출 실패!
	}else{
		gosub, success
	}
}else{
	gosub, success
}
return

success:
	FileRead, tempVar, %OutputFile%
	FileDelete, %OutputFile%
	FileAppend, %tempVar%, %OutputFile%, UTF-8
	tempVar:=
	MsgBox, 추출 성공!
return

GuiDropFiles:
	parameter := A_GuiEvent
	drop:=A_GuiControl	
	gosub parse_cmd
return

Button실행:
	gui,submit,nohide
	if ( dbFile = "" )
	{
		MsgBox, DB파일을 지정하세요
		return
	}
	if ( Folder = "" )
	{
		MsgBox,4,폴더 지정,폴더가 설정되지 않았습니다.`n스크립트가 실행된 폴더로 기본 지정됩니다`n계속 하시겠습니까?
		IfMsgBox, Yes
		{
			Folder = %A_WorkingDir%
			gosub, SelDDL
		}else{
			return
		}
	}
	gosub, Action
return

Button초기화:
	Reload
return

Exit:
GuiClose:
IfExist, %query%
	FileDelete, %query%
ExitApp