You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中如何为指定文件添加额外扩展名(如.gz)?

在Bash中直接为文件名添加.gz扩展名的正确方法

嗨,你遇到的问题其实是Bash变量赋值和字符串拼接的基础语法问题,咱们一步步来解决:

为什么你的写法不对?

你之前的NEW_NAME = $($NAME + ".gz")有几个明显的语法错误:

  1. Bash里变量赋值不能有空格,=两边必须紧贴变量名和值;
  2. Bash的字符串拼接不需要+号,直接把变量和字符串连在一起就行;
  3. $()是用来执行系统命令并捕获输出的,这里只是简单拼接字符串,完全不需要它。

正确的文件名拼接方式

要给原文件名直接添加.gz后缀,只需要这样写:

NAME="$1"  # 从脚本参数获取传入的文件名
NEW_NAME="${NAME}.gz"

用${NAME}包裹变量名是个好习惯——可以避免变量名和后面的字符串混淆(比如如果后缀是123,$NAME123会被当成另一个未定义的变量),加上双引号还能完美处理文件名包含空格或特殊字符的情况。

结合你的需求的完整示例脚本

下面是一个包含压缩前后文件大小对比的完整可运行脚本,完全匹配你的需求:

#!/bin/bash

# 检查是否传入了文件名参数
if [ $# -eq 0 ]; then
    echo "请指定要压缩的文件名作为参数!"
    exit 1
fi

# 获取原文件名和路径
SOURCE_FILE="$1"

# 检查原文件是否存在
if [ ! -f "$SOURCE_FILE" ]; then
    echo "错误:文件 $SOURCE_FILE 不存在!"
    exit 1
fi

# 获取原文件大小(Linux系统用stat -c %s,macOS用stat -f %z)
ORIGINAL_SIZE=$(stat -c %s "$SOURCE_FILE")
# 如果是macOS环境,替换成下面这行:
# ORIGINAL_SIZE=$(stat -f %z "$SOURCE_FILE")

# 用gzip压缩文件(-k参数保留原文件,默认gzip会删除原文件)
gzip -k "$SOURCE_FILE"

# 生成压缩后的文件名
COMPRESSED_FILE="${SOURCE_FILE}.gz"

# 获取压缩后的文件大小
COMPRESSED_SIZE=$(stat -c %s "$COMPRESSED_FILE")
# macOS环境替换:
# COMPRESSED_SIZE=$(stat -f %z "$COMPRESSED_FILE")

# 输出大小对比(转成人类可读格式)
echo "压缩前文件大小:$(numfmt --to=iec $ORIGINAL_SIZE)"
echo "压缩后文件大小:$(numfmt --to=iec $COMPRESSED_SIZE)"
echo "压缩率:$(echo "scale=2; $COMPRESSED_SIZE/$ORIGINAL_SIZE*100" | bc)%"

脚本关键说明

  • 用-k参数让gzip保留原文件,如果你不需要保留原文件,可以直接去掉这个参数;
  • stat命令用来获取文件的字节大小,不同系统参数略有差异,上面标注了Linux和macOS的适配方式;
  • numfmt --to=iec把原始字节数转成人类易读的格式(比如KB、MB);
  • 最后用bc工具计算压缩率,保留两位小数,让结果更直观。

这样你就能完美实现「压缩指定文件并输出压缩前后大小」的需求啦!

内容的提问来源于stack exchange,提问作者jrdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:08:06