2012年5月3日 星期四

還原Gallery2中的相本目錄名稱

原本,很久以前學校的相本是用 xoops 的 xcgal module
其實用的也頗不錯,但是後來因為討論區的功能要廢止掉,而且xoops的版本更新也出現了些斷層
所以,毅然決然的決定把電子相簿從 xoops 跳槽到 gallery
幸好當時的 xoops xcgal 竟然很神奇的有支援相簿原始檔存在中文目錄名稱
所以只要把照片從伺服器備份出來再丟到新裝好的gallery上面就可以 (不過也是花了好多時間)
換到gallery之後,速度不錯、模組也很豐富,上傳又有方便的工具  :)
不過,更新了幾次伺服器 ( 硬體更新 and 版本升級 ),搬來搬去的,又覺得實在是有點麻煩了
更要命的是,因為量變大了以後,只有用script把mysql丟到遠端伺服器、用rsync把相本同步到 NAS 備份
原始目錄檔案這麼龐大,就沒辦法再留一份啦  @@
這會兒,這次趁著有點經費,用共同供應契約買了 synologyDS2411+ 
看上的原因有儲存成本的考量、維護便利性的考量....等,當然,最重要的是管理考量
維護伺服器加上gallery VS 維護這種磁碟陣列的網路相本,後者即使彈性不如前者
但是就當相本來說,實在是沒有不勝出的理由了
好了,講了半天,總是該進入正題,換台機器跟這篇「還原Gallery2中的相本目錄名稱」有啥關係?
( 其實泰國淹大水後還有這台機器在共同供應契約裡,你有錢還沒廠商想賣你的插曲! )
重點是,gallery 的實體路徑裡沒有支援中文目錄名稱!!
所以,如果想把相片原始檔重新丟到 DS2411+ 上頭,根本就不知道那是什麼活動的相簿阿 @@
小小研究了一下,總算也是成功找回來了,寫ㄧ篇紀錄一下好了  @@
首先,從 gallery 資料庫中,可以發現 g2_item 這個資料表紀錄的是物件名稱 ( item,可能是相簿或者相片 )
判斷的方式就從 g_canContainChildren 這個欄位可見端倪,可以裝載子目錄的,肯定就是個目錄(相簿)囉!
SELECT *  FROM `g2_Item` WHERE `g_canContainChildren` = 1
先找出所有的目錄名稱後,接著就是要找出每一本相簿對應在硬碟中的路徑
別急別急,要是一步就可以解決,也就不用把這個工程記錄下來了  @@
在  g2_ItemAttributesMap  這個資料表中,列出了每一個物件的屬性
g_itemId  可以用來參照前面提到的 g2_item 資料表,g_parentSequence 就是目錄結構了!
啥? 「7/118424/118522/19/」這是目錄結構?!
沒錯,以這筆資料來說,就是存放在  item 7  底下的 item 118424 底下的 118522 底下的 19 
所以接下來 ( 距離大功告成越來越近啦!) 我們只要把這些個 item 的代碼參照回實體的名稱就可以囉!
那........參照在哪裡呢?秘密就藏在 g2_FileSystemEntity 這個資料表中
g_id 是 item 的唯一編號、g_pathComponent 就是 item 的實際名稱!哈哈~找到這邊,就跟中獎了一樣開心 ^O^
SELECT `g2_Item`.`g_id`,`g2_Item`.`g_title`,`g2_FileSystemEntity`.`g_pathComponent`,`g2_ItemAttributesMap`.`g_parentSequence`  FROM `g2_Item` left join g2_ItemAttributesMap on (g2_Item.g_id = g2_ItemAttributesMap.g_itemId ) left join g2_FileSystemEntity on (g2_Item.g_id = g2_FileSystemEntity.g_id ) WHERE `g_canContainChildren` = 1
得到類似這樣的結果
到這裡為止,可以把資料先倒出來囉 :)
資料庫操作的部分到這邊算是到一段落,接下來,你可以用程式來解析
當然,也可以不要想的太複雜,其實 excel 也就可以處理了 ^^
只是要記得,匯出成csv之後的檔案不要直接用excel打開,會亂碼滴...
先開個空白的 excel 使用匯入外部資料的方式,依照匯出的分隔條件再讀回來欄位裡面
AND 不要太信任電腦,還是稍微檢查一下有沒有分割字元錯誤的資料
然後我們要來把 g_parentSequence 欄位中那些個ID堆成的路徑先拆解開來比對
選取整欄之後,利用「資料剖析」的工具,可以把 / 當成分割字串,拆解開來
注意一下,我覺得把原本的資料留著不要覆蓋會安心一點,所以選擇一下旁邊的欄位 :)
拆解出來的結構,所有的相本其實最上層都是相同的,所以第一層也就不用理他了
( 總不會找不到第一層是放在伺服器裡面的哪個路徑吧?! )
然後我們來排序一下,反過來排序 (最下層先排遞減) 的原因是如果不先從下層變更目錄名稱會出錯的
例如:  A \ B \ C  想要變更成   甲 \ 乙 \ 丙   那麼就非得從 C 這個目錄作起
否則,先作了A目錄的更名,接著想找 A \ B 這個目錄時,就已經不存在了,因為它變成了 甲 \ B 
( ㄟ~~ 想不通的話,照做就是了 )
接著用 excel 的 VLOOKUP 函式把目錄名稱對照出來
=VLOOKUP(E4,$A$2:$C$1195,3,FALSE)      
四個引數分別是   要參照的值 , 參照資料的範圍 , 回傳第幾個欄位的值 , 是否模糊比對
看你原本的資料有幾層目錄,記得通通都要做到喔!
接著,把這些個參照完的路徑名稱拼湊拼湊
再記得把空路徑重覆了的 /  去除掉,基本上就算完成路徑參照囉!
哈哈~~看著這樣的畫面,很有成就感吧?
剩下來我的做法就是把這些個檔案配上正確的絕對路徑,丟到系統裡面配合  mv 這個語法
把一千多本相簿通通改回正確名稱,也不過幾秒鐘的時間阿!!
花了大半天的時間,總算一切就緒,把整個目錄結構丟到 DS2411+ 裡面去,大功告成! 寫下這篇紀錄,是不知道哪天還會用到,也希望有同樣需求的朋友們少些摸索的時間囉~ 其中有幾點要稍微留意一下 1.先備份相簿再做更名,千萬不要直接對 gallery 當中的相簿目錄做更名,否則 gallery 就毀了 2.目錄名稱如果有特殊字、符號,使用 mv 語法的時候可以加上 "path\目錄名稱" 才不會出現錯誤 3.關於 mv 語法 「  mv "路徑\原目錄名稱" "路徑\新目錄名稱"  」 ,參考:鳥哥的linux私房菜 4.如果 excel 處理完指令的部分,可以直接貼到一個文字檔案後加上 x 的執行屬性,ㄧ次解決 :)

( 原文同步發表於 bubble's weblog )

沒有留言:

張貼留言