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

如何单独压缩每个文件且归档名不含原文件扩展名?

问题解决:批量生成符合要求的7z归档文件

我需要整理一批文件供其他程序使用,该程序仅支持形如My Document.7z的归档文件名,不接受My Document.txt.7z这种带原扩展名的命名。之前尝试用删除文件名最后4个字符的方式生成归档名,但这会破坏.sh、.jpeg这类扩展名长度非3的文件,现在需要正确的Bash处理方案。

我之前的错误代码

#!/bin/bash
shopt -s extglob
for f in *.* ; do
f$ !(*.sh)
 g=$($f-4) #placeholder code for delete last 4 characters of filename syntax
 7z a $g.7z $f -sdel
done
read -p "pause"
exit

修正后的脚本

#!/bin/bash
shopt -s extglob

# 遍历当前目录下所有带扩展名的文件,排除.sh脚本文件
for f in !(*.sh); do
    # 仅处理文件(排除目录)
    [[ -f "$f" ]] || continue
    # 获取不带扩展名的文件名(类似Batch的%%~ni)
    g="${f%.*}"
    # 生成指定格式的7z归档,完成后删除原文件
    7z a "$g.7z" "$f" -sdel
done

read -p "操作完成,按任意键退出..."
exit

关键部分解释

  • 启用extglob:shopt -s extglob用来支持扩展通配符,方便排除.sh文件。
  • 遍历筛选文件:!(*.sh)直接排除所有.sh后缀的文件,避免脚本自身被处理。
  • 判断是否为文件:[[ -f "$f" ]] || continue确保只处理普通文件,跳过目录。
  • 获取无扩展名的文件名:${f%.*}是Bash的参数扩展语法,会删除文件名中最后一个.及其后面的所有内容,完美替代Batch的%%~ni,不管原扩展名长度是多少都能正确处理。
  • 安全的变量引用:所有变量用双引号包裹,避免文件名含空格或特殊字符时出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:52:32