1. 程式人生 > >最近,資料遷移差點讓我抓狂

最近,資料遷移差點讓我抓狂

本文微信公眾號「AndroidTraveler」首發。

背景

最近,要重灌 macOS,所以需要拷貝資料進行備份。

而這個備份過程差點讓我抓狂,速度超級慢,等待時間很是煎熬。

分析

這邊看了一下,主要是因為檔案過多對資料遷移速度造成了較大的影響。

大家知道,我們用 AndroidStudio 新建一個 HelloWorld 專案,系統會自動幫我們生成很多檔案。

這邊建了一個,並查看了檔案(包括目錄)數目,有 85 個檔案,這還是最簡單的專案。

假設一般的專案平均 1000 個檔案,有 100 個專案則檔案數目達到 10 萬級別。(PS:我遇到過一個專案就高達 5 萬多個檔案數目的)

如果你直接拷貝的話,那麼耗時是非常長的,尤其是對於機械硬碟而言。

那麼我們能否壓縮一下呢?

這麼大量的檔案,如果你一次性全部壓縮成一個檔案,那麼耗時也是比較大的。

因此這邊就想可否每個專案單獨壓縮,這樣耗時是不是就相對要少一些呢?

但是直接在 mac 上面右鍵並沒有批量壓縮選項。

選擇多個系統會以為你要把多個目錄壓縮成一個檔案。

我們知道,壓縮檔案可以使用命令列。

所以我們可以通過指令碼來實現批處理壓縮檔案。

實戰

那下面我們就一步一步來完成批處理壓縮指令碼的編寫。

Step 1: 建立並執行指令碼

我們假設建立的指令碼名字為 batch_zip.sh。

在終端上執行下面命令:

touch batch_zip.sh;chmod u+x batch_zip.sh

第一條命令是建立 batch_zip.sh 檔案,第二個命令是為該檔案增加可執行許可權,因為我們的指令碼最後是需要執行的。

如果你是直接拷貝我文末連結上的指令碼檔案,你下載到本地只需要執行第二條命令即可。

Step 2: 熟悉壓縮命令

首先我們需要了解壓縮命令。最基本的壓縮命令如下:

zip 壓縮後文件.zip 壓縮前檔案

由於我們有遞迴壓縮需求,因此需要新增 -r 選項。

另外壓縮過程預設會顯示壓縮詳情,比如具體壓縮了哪些檔案。

如果你不想知道具體壓縮過程,可以新增 -q 選項。

我們將這兩個選項組合起來,最終壓縮命令就是:

zip -rq 壓縮後文件.zip 壓縮前檔案

你以為這就結束了?

假設壓縮前的檔案命名帶有空格,你直接用上面的命令,那麼會出現意想不到的結果,所以為了應對這種情況,我們需要稍作修改,給檔名加個引號(單引號雙引號都可以)括起來。

zip -rq '壓縮後文件.zip' '壓縮前檔案'

Step 3: 羅列當前目錄的所有檔案

我們知道,羅列當前目錄所有檔案只需要使用 ls 命令即可。

所以我們將這個命令返回的結果集用一個變數儲存起來,然後我們列印看下效果。

我們修改我們的指令碼檔案,修改後如下:

FILES=`ls`
echo $FILES

注意這裡不是單引號,這裡的符號位置在鍵盤左上角處。

然後我們執行指令碼:

./batch_zip.sh

就可以看到羅列出的檔案了。

Step 4: 迴圈遍歷所有檔案

因為我們的檔案都放在集合裡面,因此我們需要逐個遍歷獲取,然後逐個進行壓縮操作。

這裡用到了迴圈語句,基本結構如下:

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

具體指令碼分析我們就不展開了。大家感興趣可以看文末參考連結。

Step 5: 只壓縮目錄

其實我們壓縮的是對於包含大量瑣碎檔案的目錄,因此只需要壓縮目錄就可以了。

另外我們的指令碼檔案因為是檔案,包括壓縮檔案也是普通檔案,因此不需要額外進行排除。

改造後代碼如下:

#!/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 塊裡面。

主要是增加了一個判斷,當檔案是目錄時,才執行列印操作。

Step 6: 替換列印為壓縮命令

結合 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 也有具體的用法說明。

優化點

這個指令碼命令還有很多地方可以優化,有待大家去完善。

這裡列舉如下;

  1. 支援壓縮指定目錄而不是固定為當前目錄,指定目錄通過執行指令碼時引數帶入
  2. 壓縮結束後告知本次成功壓縮的總數目
  3. 增加一個邏輯判斷,壓縮成功後是否刪除原檔案?可以通過執行指令碼時引數帶入

這裡就不再描述了,相信對於讀者來說,要實現這些優化也是很簡單的事情。

溫馨提示

其實如果你是要換機器,而且當前系統沒有 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

相關推薦

最近資料遷移差點

本文微信公眾號「AndroidTraveler」首發。 背景 最近,要重灌 macOS,所以需要拷貝資料進行備份。 而這個備份過程差點讓我抓狂,速度超級慢,等待時間很是煎熬。 分析 這邊看了一下,主要是因為檔案過多對資料遷移速度造成了較大的影響。 大家知道,我們用 AndroidStudio 新建一個 Hel

兩件小事 之一:Mac OSX上沒有可用的雙拼

1995年我就看上了蘋果電腦,但是沒有錢,也沒必要買,當時的蘋果電腦還很難用,高層應用和PC有很大的差異,但是現在的Mac OSX已經很好用了,很多平時在PC上賴以生存的工具都有了Mac版。簡單舉兩個例子,凡是跟Apache/Eclipse/Mozilla/Codehaus有

一言難盡Jpa這個功能差點丟了工作

## 故事背景 前陣子,有位朋友在微信上問我資料被刪了能不能恢復,我問了下原因,居然是因為一個配置項惹的禍。 ![](https://img2020.cnblogs.com/blog/1618095/202005/1618095-20200524153047555-1592589243.png) #

一個神祕URL釀大禍差點背鍋!

## 神祕URL 我叫小風,是Windows帝國一個普通的上班族。上一回說到[因為一個跨域請求,我差點丟了飯碗](https://mp.weixin.qq.com/s/K15IVpe57STOf0SxyLEg9A),好在有驚無險,我的職場歷險記還在繼續。 “叮叮叮叮~~~~”,鬧鐘又把我給吵醒了,我一

Python是什麽遇見你

也不會 不能 過程 改變 ooo 有關 同學 二級 沒有 有些不可思議,作為一個曾學了半年C語言還掛了的計算機學渣,我竟然選擇了Python這門計算機語言課。事實上,我是有過猶豫的,畢竟知道自己不擅長這方面的學習還選這門課,這種行為確實看起來有點傻傻的。但最終我還是

性別歧視在日本:“是女生所以社會不學醫”

持久 Once published mina 入學考試 desc 發生 rim rime 今日導讀大家在看病的時候,有留意過女醫生的比例嗎?在性別歧視現象十分嚴重的日本,男醫生和女醫生的比例達到了驚人的 4:1。 而就在最近,聲名遠揚的東京醫科大學竟然爆出蓄意降低女性考生的

【網絡工程師培訓】IPv6:IPv4犯的錯為什麽來彌補

工程師培訓 隨著 時也 nat 它的 數量 技術分享 計算器 int 在過去的十年間,IPv6 本來應該得到很大的發展,但事實上這種好事並沒有降臨。    由此導致了一個結果,那就是大部分人都不了解 IPv6 的一些知識:它是什麽,怎麽使用,以及,為什麽它會存在?    

django 連線MYSQL時資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'na

django 連線MYSQL時,資料遷移時報:django.db.utils.InternalError: (1366, "Incorrect string value: '\\xE9\\x97\\xAE\\xE9\\xA2\\x98' for column 'name' at row 5") 這個問題是由

多執行緒抽取資料庫資料資料遷移

關鍵程式碼 2000萬資料同步,每次查詢20000分頁,一分鐘分鐘之內全部塞入到佇列裡等待 log.info("房屋數倉資料同步排程開始!"); Date yesterday = null; HouseFeedbackCount hfb = getH

Android GreenDao3資料庫升級資料遷移

GreenDao3,當我們進行資料庫版本升級的時候,會預設刪除刪除所有的表,然後重新建立 WARNING已經提示我們了,如果我們需求是在升級資料庫之後儲存當前的所有資料,則需要對onUpgrade( )方法重寫。 /** * @作者:TJ * @時間:201

Linux作業系統下部署Jenkins環境資料遷移(備機部署)以及主從節點的配置

         本文所闡述的,均是在Linux作業系統下部署Jenkins環境,採用的解決方案是,使用Tomcat、Jenkins.war包和maven,以及利用Nginx做Tomcat的反向代理來實現Jenkins的CI/CD。

redis--節點新增切換資料遷移

新增redis節點, redis版本為redis-3.0.7   ruby-2.2.2 新增主節點到叢集命令:  [xxxxxx src]# ./redis-trib.rb  add-node 192.168.76.116:6380 192.168.76.116:637

“媽媽,我不想學了”你的回答改變孩子一生(悵然若失說了一句話:“為什麼當初沒有人逼?”。不願意學你就不讓我學啦!那時候還小,我還不懂事難道你也不懂事嗎。要做成一件事就必須有延遲滿足的能力)

“媽媽,我不想學了”,你的回答改變孩子一生(組圖)新聞來源: 槽值 前兩天,送孩子去書法班的時候,在小區門口看到一位媽媽,她正拽著孩子往車裡進,孩子哭著掙扎:“我不想學舞蹈了,我不去,太累了……” 媽媽怒吼著:“你今天去也得去,不去也得給我去!” 最終,孩子還是拗不過媽媽,上了車,去學舞蹈。 我不禁想

週末imac機重灌win7裝得

自用mac機以前裝的是win7 32位的系統,一直受記憶體限制,越來越慢,週末決定裝個64位的系統,朋友建議在虛擬機器上裝win7,想想這樣估計會影響速度,就還是採用了mac,win7雙系統。 第一個坑:用bootcamp引導安裝時,在“配置檔案”那卡住了,試了好幾次,都過

今天下午傑森來了 ta的出現想起了兩年前的那些新鮮事... ...

      兩年前的這個時候,也是11月份,剛剛到這裡來上班,一切從頭開始,一切都新鮮、真新鮮,傑森是當時的見證者,那時侯發生的事真新鮮、真有趣 ... ...        傑森可能都快忘掉那些事情了,不過我回憶起來還是清晰的很,因為那時侯剛剛來到這個嶄新的環境,憧憬、好

Android資料庫升級資料遷移

版本迭代時難免需要對資料庫欄位進行增加,刪除與修改操作。這時便需要對原有的資料進行遷移,以保證不丟失資料。對資料庫的遷移我們需要做一下幾個步驟:① 建立臨時表,將原來的資料複製到臨時表中。② 刪除原表,原表資料已經備份至臨時表中,不再需要,進行刪除。③ 建立新表,呼叫建立新表

請假過來面試沒有被錄用總不能一點收穫都沒有吧

候選人:我一天工資500+,請假面試至少要半天,面試沒有被錄用,白白損失200+的工資,總不能一點收穫都沒有吧。 面試官:我一天工資1k+,面試至少要一小時,候選人不符合要求,這一個小時公司因為我少收入了200+,總不能一點收益都沒有吧。 面試之前 as候選人,從接到面試邀請的時候,最好在電話裡先了解清楚

什麼鬼面試官竟然用Redis實現一個訊息佇列!!?

GitHub 9.4k Star 的Java工程師成神之路 ,不來了解一下嗎? GitHub 9.4k Star 的Java工程師成神之路 ,真的不來了解一下嗎? GitHub 9.4k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎? 眾所周知,redis是一個高效能的key-value資料庫

建立執行緒那麼容易為什麼非要使用執行緒池?(深深深入剖析)

一、概述 1、問題 先看我們遇到的問題:我們建立執行緒的方式很簡單,new Thread(() -> {...}),就是因為這麼簡單粗暴的方式,才帶來了致命的問題。首先執行緒的建立和銷燬都是很耗時很浪費效能的操作,你用執行緒為了什麼?為了就是非同步,為了就是提升效能。簡單的new三五個Thread還好,

IDEA 非常重要的一些設定項 → 一連串的問題差點重新用回 Eclipse !

開心一刻   建築行業內,我看過的最凶殘笑話(IT行業內好一致!)   上聯:一天晚上兩個甲方三更半夜四處催圖只好週五加班到週六早上七點畫好八點傳完九點上床睡覺十分痛苦   下聯:十點才過九分甲方八個簡訊七個電話居然要六處調整加五張圖紙四小時交三個文字兩天週末只睡一個小時   橫批:用原來的 內心的獨白