如何单独压缩每个文件且归档名不含原文件扩展名?
问题解决:批量生成符合要求的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_
相关产品推荐
相关产品推荐

