本文微信公衆號「AndroidTraveler」首發。html
最近,要重裝 macOS,因此須要拷貝數據進行備份。git
而這個備份過程差點讓我抓狂,速度超級慢,等待時間非常煎熬。github
這邊看了一下,主要是由於文件過多對數據遷移速度形成了較大的影響。shell
你們知道,咱們用 AndroidStudio 新建一個 HelloWorld 項目,系統會自動幫咱們生成不少文件。bash
這邊建了一個,並查看了文件(包括目錄)數目,有 85 個文件,這仍是最簡單的項目。微信
假設通常的項目平均 1000 個文件,有 100 個項目則文件數目達到 10 萬級別。(PS:我遇到過一個項目就高達 5 萬多個文件數目的)優化
若是你直接拷貝的話,那麼耗時是很是長的,尤爲是對於機械硬盤而言。spa
那麼咱們可否壓縮一下呢?命令行
這麼大量的文件,若是你一次性所有壓縮成一個文件,那麼耗時也是比較大的。code
所以這邊就想能否每一個項目單獨壓縮,這樣耗時是否是就相對要少一些呢?
可是直接在 mac 上面右鍵並無批量壓縮選項。
選擇多個系統會覺得你要把多個目錄壓縮成一個文件。
咱們知道,壓縮文件可使用命令行。
因此咱們能夠經過腳原本實現批處理壓縮文件。
那下面咱們就一步一步來完成批處理壓縮腳本的編寫。
咱們假設建立的腳本名字爲 batch_zip.sh。
在終端上執行下面命令:
touch batch_zip.sh;chmod u+x batch_zip.sh
第一條命令是建立 batch_zip.sh 文件,第二個命令是爲該文件增長可執行權限,由於咱們的腳本最後是須要運行的。
若是你是直接拷貝我文末連接上的腳本文件,你下載到本地只須要執行第二條命令便可。
首先咱們須要瞭解壓縮命令。最基本的壓縮命令以下:
zip 壓縮後文件.zip 壓縮前文件
因爲咱們有遞歸壓縮需求,所以須要添加 -r 選項。
另外壓縮過程默認會顯示壓縮詳情,好比具體壓縮了哪些文件。
若是你不想知道具體壓縮過程,能夠添加 -q 選項。
咱們將這兩個選項組合起來,最終壓縮命令就是:
zip -rq 壓縮後文件.zip 壓縮前文件
你覺得這就結束了?
假設壓縮前的文件命名帶有空格,你直接用上面的命令,那麼會出現意想不到的結果,因此爲了應對這種狀況,咱們須要稍做修改,給文件名加個引號(單引號雙引號均可以)括起來。
zip -rq '壓縮後文件.zip' '壓縮前文件'
咱們知道,羅列當前目錄全部文件只須要使用 ls 命令便可。
因此咱們將這個命令返回的結果集用一個變量保存起來,而後咱們打印看下效果。
咱們修改咱們的腳本文件,修改後以下:
FILES=`ls` echo $FILES
注意這裏不是單引號,這裏的符號位置在鍵盤左上角處。
而後咱們運行腳本:
./batch_zip.sh
就能夠看到羅列出的文件了。
由於咱們的文件都放在集合裏面,所以咱們須要逐個遍歷獲取,而後逐個進行壓縮操做。
這裏用到了循環語句,基本結構以下:
for element in array do // TODO done
// TODO 裏面就是你具體要處理的事情。
因此咱們能夠修改腳本文件以下:
FILES=`ls` for file in $FILES do echo $file done
這樣運行以後就會逐個打印羅列後的文件名。
若是你當前目錄有文件的名字是包含空格的話,你會發現打印出來的有空格文件名被隔開了。
好比你的文件名是 test 2.txt,則打印會打印出兩行,分別是 test 和 2.txt。
由於 ls 命令列出的不一樣文件就是用空格隔開的。
因此通常狀況下推薦命名不要有空格,若是須要分隔,能夠用下劃線 _。
可是假設真的有怎麼辦?
別慌,問題不大。
直接 show 代碼以下:
#!/bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") for file in * do echo $file done IFS=$SAVEIFS
具體腳本分析咱們就不展開了。你們感興趣能夠看文末參考連接。
其實咱們壓縮的是對於包含大量瑣碎文件的目錄,所以只須要壓縮目錄就能夠了。
另外咱們的腳本文件由於是文件,包括壓縮文件也是普通文件,所以不須要額外進行排除。
改造後代碼以下:
#!/bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") for file in * do if [ -d $file ] then echo $file fi done IFS=$SAVEIFS
修改點在 do-done 塊裏面。
主要是增長了一個判斷,當文件是目錄時,才執行打印操做。
結合 Step2 咱們最終的腳本命令爲:
#!/bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") for file in * do if [ -d $file ] then zip -rq $file.zip $file echo $file was successfully compressed. fi done IFS=$SAVEIFS
壓縮成功每一個文件都會打印一句壓縮成功。
只須要將腳本命令拷貝到你須要壓縮的目錄下面,就能夠對跟腳本文件同級的全部目錄進行壓縮。
記得腳本文件須要有可執行權限才能運行。
若是提示沒有權限,能夠先運行以下命令添加權限。
chmod u+x batch_zip.sh
你們能夠到 GitHub 倉庫上面去直接下載本文最終生成的腳本文件。
https://github.com/nesger/EffectiveTools/blob/master/shell/batch_zip.sh
裏面的 README.md 也有具體的用法說明。
這個腳本命令還有不少地方能夠優化,有待你們去完善。
這裏列舉以下;
這裏就再也不描述了,相信對於讀者來講,要實現這些優化也是很簡單的事情。
其實若是你是要換機器,並且當前系統沒有 bug 的話。
推薦使用時間機器(Time Machine)進行系統遷移。
它至關於把你一臺機器上的整個系統(包括文件)進行一個遷移,省去了你從新安裝應用程序和搭建環境的時間。
參考連接:
https://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
https://www.cnblogs.com/cocowool/archive/2013/01/15/2861904.html