實現該功能須要安裝 pv,而後把須要處理的數據經過管道傳給 pv,最後再進行操做。linux
傳給 pv 的目的是爲了知道已經處理的數據量大小,同時須要經過 -s 指定總共須要處理的數據量大小。sql
pv 的安裝通常的軟件管理工具都有提供:ubuntu
如 centos 下 yum install pvcentos
ubuntu : apt-get install pvbash
mac:brew install pv工具
pv 的詳細用法可參考:https://linux.die.net/man/1/pv.net
mac:blog
tar -cf - questions.sql | pv -s $(($(du -sk questions.sql | awk '{print $1}') * 1024)) | gzip > question.tar.gz
其餘系統(ubuntu、centos ...):ip
tar -cf - questions.sql | pv -s $(du -sk questions.sql | awk '{print $1}') | gzip > question.tar.gz
該命令將 questions.sql 壓縮到 question.tar.gz。get
命令詳解:
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