Bash中如何为指定文件添加额外扩展名(如.gz)?
在Bash中直接为文件名添加.gz扩展名的正确方法
嗨,你遇到的问题其实是Bash变量赋值和字符串拼接的基础语法问题,咱们一步步来解决:
为什么你的写法不对?
你之前的NEW_NAME = $($NAME + ".gz")有几个明显的语法错误:
- Bash里变量赋值不能有空格,
=两边必须紧贴变量名和值; - Bash的字符串拼接不需要
+号,直接把变量和字符串连在一起就行; $()是用来执行系统命令并捕获输出的,这里只是简单拼接字符串,完全不需要它。
正确的文件名拼接方式
要给原文件名直接添加.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
相关产品推荐
相关产品推荐

