2021年5月23日 星期日

如何在 iOS 上分割檔案?


好久沒更新了 .... 在大陸一年的生活總結還沒時間寫 (雖然我不斷地在收集素材),而這篇文章也只是簡單的分享一個 iOS 小技巧。真的呼籲所有來大陸工作的人,盡量不要做一週上班六天的工作,真的是什麼生活都沒有了,大概只剩下工作 + 吃 + 休息,這些爛事等我離職之後再說吧。


這篇文章來自於我在工作時一個需求。某次我從其他廠商那裡取得一份技術文件,大約 37 MB,我想把這檔案存到公司的電腦中,但是面臨幾個問題:1. 我在特級安保區內工作,所有有金屬的東西都帶不進來 (正確地說是有物流崗可以把有金屬的東西運進來,但是警衛是不會給 USB 隨身碟放行的);2. 特保區的電腦不能插 USB 碟;3. 若以外部信件寄進公司的工作信箱,檔案大小有 10 MB 的限制。由於 1、2 點不用想都知道無解,所以把檔案分割之後分次寄進來是最簡單的,可是 .....


一般我們在電腦上要分割檔案是很簡單的,任何一個壓縮軟體 (例如 7-zip、Keka) 都支援檔案分割,使用起來都有圖形介面,幾乎沒有技術難度,但在 iOS 這種 App 取向的作業系統,除非 iOS 內建的 "檔案" App 支援分割壓縮,不然就只能找第三方 App。很遺憾也不意外地,iOS 並無原生支援此功能,於是我就開始在 App store 漫漫地搜尋符合需求的 App。由於我身處的地緣關係,我使用一個工作用的中國區 Apple ID,撇開中國 App 介面的花里胡哨及「一個鳥工具 App 都有臉搞訂閱制」的亂象,我發現這不是哪國 App 的問題,而是在 App store 上就幾乎沒有提供分割壓縮功能的 App,而且我也上 Google 找了一下,實在沒找到有用的資訊。


當然啦,真要說沒有也不可能,分割壓縮在中國叫作「分卷壓縮」,目前看到「解壓專家」有提供這個功能,但是軟體本身極其癰腫,而且要付錢才能用這個「高級」功能。其他大部分壓縮 App 支援的僅是分卷「解壓」,比如說風評很好的「解壓大師」,對於分割檔案的需求還是做不到。



所以怎麼解決?只好請出命令列了!iSH 是一個輕巧的 Linux 模擬環境,裡面有一個小巧的 Alpine Linux,雖然比不上 Ubuntu Linux 等主流 Linux distro 的百花齊放及功能完備,但基礎的功能都有。而且,相對於一個獨立於系統之外的 Linux 沙盒只配稱作玩具,iSH 與之最大的不同就是內建的 Linux 檔案系統是與 iOS 整合在一起的,我們可以從任一 App 裡將檔案複製到 iOS 檔案 App 的 iSH 目錄下,使用命令列指令 (shell command) 來處理這些檔案或是文字,能幹的事數不勝數。



我以這次的需求為例,首先在檔案 App 裡打開 iSH 目錄的權限,操作方式請參考官方的說明「View iSH files in Files App」。接下來將檔案放到 iSH 目錄下的 root 資料夾中,再回到 iSH 的命令列界面,使用 tar 將檔案打包壓縮,再用 split 分割即可。


tar -cjvf marking.tar.bz2 MarkingmateHelp.pdf 

split -b 10m marking.tar.bz2 "marking.tar.bz2.part"

-c 壓縮

-j 壓縮成 bz2 格式 (-z 為壓縮成 gz 格式)

-v verbose,意指會將所有被壓縮的檔案列出

-f 指定壓縮檔檔名的使用模式

-b 指定分割的檔案大小

10m = 10 MB


我在上圖中是將檔案壓縮成 bz2 檔,但在我的 iPhone SE 上耗時很久,所以若不在意檔案大小的話,建議使用 tar 直接打包不壓縮 (後綴去掉 -j,用 -cvf),經過我的實測 tar 不壓縮幾乎是轉眼就跑完了。



split 也有兩個坑:1. 10 MB 要寫成 10m,不能用大寫的 M (這好像是 Alpine Linux 才有的限制?);2. 分割的大小必須要是整數,請看上圖的實例。


當然,也可以使用 pipe 將兩個指令串在一起,以上面的列子舉例:

tar -cjvf - MarkingmateHelp.pdf | split -b 10m - "marking.tar.bz2.part"


以上的指令參考了兩篇很好的教學文:18 Tar Command Examples in LinuxHow to Split Large ‘tar’ Archive into Multiple Files of Certain Size,其他細節與應用請看網頁內文。


最後,要知道 tar 只是 iSH 模擬的 Linux 環境中的一個小功能,可玩性遠遠不只如此。比如說開啟 SSH server 也是很實用的功能,因為 iOS 預設只支援 SSH 遠端登入別的電腦,iOS device 本身並不支援讓別的裝置遠端登入它,原因應該是安全問題。iSH 是在沙盒中的虛擬系統,於是它使 iOS device 能夠在不妥協安全問題的情況下又支援讓其他裝置遠端登入,相當有趣又實用,只是需記得每次使用時都要重新開啟 SSH daemon (/usr/sbin/sshd)。


後記

其實我在 iSH 的 TestFlight 時期就已經安裝了,可是一直沒有使用它,為啥?因為沒有必要。iOS 的軟體生態非常齊全,坦白說任何需求都能找到使用體驗好的 App,何必要去折騰命令列?這次的事件只是一個意外,我依然不會把 iSH 當作生產力的主力軟體,但作為一個備用的軟體庫及後盾,iSH 完美地扮演了這個角色。


沒有留言:

張貼留言