嗯 … 標題有點囉嗦,在系統上要更新程式時,常常會先將欲更新的程式,重點在於在下指令解壓縮 tar 檔時,如果只用一般常見的下法:tar zxvf xxx.tar.gz 的話,那麼解壓縮出來的檔案的 modification time 會維持當初打包 tar 檔的時間,而不會是執行解壓縮 tar 檔的時間,在資安稽核要求很嚴謹的環境中,以上的狀況是不被接受的。
要讓 tar 檔解壓縮出來的檔案的 modification time 被修正為執行指令的當下時間很簡單,參考 tar 指令的 man page:
此處渴看到關鍵字「touch」,再查一下 touch 指令的 man page:
touch [OPTION]... FILE...
Description
Update the access and modification times of each FILE to the current time.
所以說,爾後解壓縮 tar 檔時只要下如此的指令:tar zxvfm xxx.tar.gz,那麼解壓縮出來的檔案的 modification time 就會是執行指令的當下時間啦!(看起來是 tar 這支程式會自動幫你 touch 壓縮檔內的所有檔案/目錄)
PS. 昨天為了這個需求,還寫了個 4、50 行的 Perl 程式 (先建立 temp 目錄 –> 把原始 tar 檔複製到 temp 目錄 –> 在 temp 目錄解壓縮 –> 把解壓縮出來的所有檔案/目錄 touch 一遍 –> 再壓縮成一個新的 tar 檔 –> 把新的 tar 檔複製到真正的目的資料夾 –> 在目的資料夾解壓縮 –> 回頭刪掉 temp 目錄),現在看起來真的是蠢斃了 =.= 幸好隔了一天就發現 -m 這個參數 … 可見認真的讀完 man page 是多麼重要的事情!
不過在寫 Perl 的過程中又多學到了一些處理檔案、目錄的技巧,例如 mkdir -p 可以自動幫你建立完整的目錄階層;cp -a 類似沒有加上 -m 的 tar,效果等同於幫指定目錄建立另一個名稱不同的目錄,再把指定目錄下的所有子目錄和檔案複製到新目錄中,但是新目錄下的檔案 modification time 跟原目錄是一樣的 …
沒有留言:
張貼留言