2013/10/18

backup newer files

在編譯 browser, kernel, 或 android 時,會產生非常多的輸出,如果要把這些輸出檔備份下來,一個最簡單的方法是 tar --newer REF_DATE_OR_FILE -cf  BACKUP.tar
也就是建立一個參考的日期或檔案,然後找出比它新的將之 tar 起來

另外,若想得到這個清單,當然也可以在 tar 完後再用 tar -t 來取得。不過若不想建立 tar 檔時怎麼處理?底下是一個 shell-script,

$ cat list-file-timestamp
#!/bin/bash
EXE=$0
EXE=${EXE##*/}
DIR=$1
[ "x$DIR" = "x" ] && DIR='.'
[ ! -d $DIR ] && DIR='.'
FORMAT=$2
[ -f BUILD-DATE ] && BUILD_DATE=BUILD-DATE
[ "x$BUILD_DATE" = "x" ] && [ -f checkenv.log ] && BUILD_DATE=checkenv.log
[ "x$BUILD_DATE" = "x" ] && [ -f ./out/target/product/pandora_g2_check-dep.log ] && BUILD_DATE=./out/target/product/pandora_g2_check-dep.log
[ "x$FORMAT" = "x" ] && FORMAT='+'
OUT=/tmp/${EXE}.lst

echo "EXE=$EXE, OUTPUT=$OUT, DIR=$DIR FORMAT=$FORMAT"
find $DIR -type f -newer $BUILD_DATE -printf "%T${FORMAT} %p\n" | sort -n -r > $OUT

用法也相當簡單:
$ list-file-timestamp
$ list-file-timestamp out
$ list-file-timestamp out @

第二個範例是指定目錄,預設是 $PWD,也就是 .
第三個是指定輸出的日期 format, 請 man find 來查,在 -printf format 項下,預設是 +

用 tar 的缺點當然就是耗時耗磁碟

可是如果已經透過上面的 list-file-timestamp 建立檔案清單了,該怎樣將它備份呢?最簡單的想法是:
$ tar cf BACKUP.tar `cat LIST_FILE`
通常會因檔案太多,無法使用上面的命令,這時候可以考慮用 xargs
$ cat LIST_FILE | xargs tar uf BACKUP.tar

不過,老實講, tar 相當慢,還可以用下面的方法:
$ cat LIST_FILE | xargs -I % cp --parents % ../BACK_DIR
上面 xargs -I % 是用來指定傳給 xargs 的參數,因為預設這個參數會加在命令的最後
而 cp --parents 則是保留目錄結構

2013/10/17

縮小 vmware ubuntu vmdk 虛擬磁碟影像檔 shink

有二個步驟,先是開啟 Guest OS, 將它的剩餘磁碟空間清乾淨,這樣才有辦法壓縮
$ cat /dev/zero > zero.fill; sync; sleep 1; sync; rm -f zero.fill

可以看到普通使用者也可以進行,當然這是因為系統沒有設定 QUOTA, 建議可以保險點用 sudo 來進行,例如:
$ sudo cat /dev/zero > zero.fill; sync; sleep 1; sync; sudo rm -f zero.fill

再來就是在 HOST OS 中將它壓縮,一般網路上查到的作法分兩步,第一個就是「磁碟重整」,再來才是壓縮。但是經過實驗,可以合併成一步:

C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager -r D:\my.vmdk -t 0 D:\my-vmdk-shrink.vmdk