Shell-Script

使用具有特定模式的 /bin/gzip 壓縮文件

  • April 17, 2018

我想用特定的模式單獨壓縮文件。例如,我的目錄如下:

/log/log1
   -/1/log2/file.1
   -/1/log2/file123
   -/1/log2/file2.1
/log/log2
   -/2/log2/file4.1
   -/2/log2/file345
   -/2/log2/file3.1

我想以遞歸方式壓縮 /log 中所有副檔名為 .1 的文件。

結果看起來像

/log/log1
   -/1/log2/file.gz
   -/1/log2/file123
   -/1/log2/file2.gz
/log/log2
   -/2/log2/file4.gz
   -/2/log2/file345
   -/2/log2/file3.gz

find+**bash**解決方案:

find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;

gzip選項:

  • -n- 壓縮時,預設不保存原始文件名和時間戳
  • -c- 在標準輸出上寫入輸出;保持原始文件不變

${1:0:-2}-bash切片;獲取截斷最後 2 個字元的文件路徑

您可以執行以下操作:

find /log -name '*.1' -type f -exec sh -c '
 for file do
   gzip "$file" && mv -i "$file.gz" "${file%.*}.gz"
 done' sh {} +

我們使用gzip file && mv -i file.gz newfileasgzip < file > newfile && rm -f file來受益​​於gzip’ 將一些元數據保存到壓縮文件中mv -i的能力以及更好地處理衝突的能力。

引用自:https://unix.stackexchange.com/questions/438295