實現該功能需要安裝 pv,然后把需要處理的數據通過管道傳給 pv,最后再進行操作。
傳給 pv 的目的是為了知道已經處理的數據量大小,同時需要通過 -s 指定總共需要處理的數據量大小。
pv 的安裝一般的軟件管理工具都有提供:
如 centos 下 yum install pv
ubuntu : apt-get install pv
mac:brew install pv
pv 的詳細用法可參考:https://linux.die.net/man/1/pv
壓縮:
mac:
tar -cf - questions.sql | pv -s $(($(du -sk questions.sql | awk '{print $1}') * 1024)) | gzip > question.tar.gz
其他系統(ubuntu、centos ...):
tar -cf - questions.sql | pv -s $(du -sk questions.sql | awk '{print $1}') | gzip > question.tar.gz
該命令將 questions.sql 壓縮到 question.tar.gz。
命令詳解:
tar -cf 我們知道 -f 是指定目標文件,這里 -f 后面是 - , 代表將需要壓縮的數據輸出到 stdout(標准輸出),這樣管道的后面才可以接收到需要處理的數據。
pv 命令的作用是,將輸入復制一遍然后輸出到 stdout,這樣最后的 gzip 命令才有數據可以處理,最后通過 gzip 命令把前面的輸出處理之后保存到 question.tar.gz。
pv -s 后面一串的命令是獲取需要處理的所有數據的大小(單位:字節),mac 下 du -sk 獲取到的數值是以 k 為單位的,而其他 *nix 系統則不一樣,參數需要改為 du -sb,同時也不需要再乘以 1024。
解壓:
pv question.tar.gz | tar -zxf -
解壓命令沒那么多參數,因為需要解壓的文件大小已經確定,不需要我們手動計算一遍。
上面的命令通過 pv 讀取需要解壓的文件到 stdout,然后通過管道傳遞給 tar 命令,tar 命令從標准輸入獲取要處理的數據進行解壓。
附 tar 壓縮顯示進度小腳本:
#!/bin/bash if [[ $1 = '' ]]; then echo "參數缺失,用法 'tarpv 文件名/目錄名'" exit 1 fi tar -cf - "$1" | pv -s $(($(du -sk "$1" | awk '{print $1}') * 1024)) | gzip > $1.tar.gz