求助:编写Bash脚本将子文件夹内容打包为独立7z归档
实现与Batch等效的Bash打包脚本
问题场景
当前目录下存在多个子文件夹(如Aburner、Btoads、gigawing),每个文件夹内包含若干文件。现有一段可正常运行的Batch代码:
for /d %%d in (*.*) do 7z a "%%d.7z" ".\%%d\*"
这段代码的作用是:将每个子文件夹内的文件打包为与文件夹同名的7z归档,且归档内仅包含文件(不含原文件夹层级)。
但尝试的Bash脚本存在问题:要么把所有内容打包到一个归档,要么归档内会保留子文件夹层级(即结构为「文件夹名/文件」,而非直接存放文件),需要实现功能完全等效的Bash脚本。
解决方案
方法一:用7z排除参数实现
for dir in */; do dir_name="${dir%/}" 7z a -r "$dir_name.7z" "$dir"/* -xr!"$dir" done
说明:
for dir in */:遍历当前目录下所有子文件夹(遍历结果末尾带/)dir_name="${dir%/}":移除文件夹路径末尾的/,得到纯文件夹名称7z命令参数:-a:执行添加文件到归档的操作-r:递归处理子目录(如果目标文件夹内还有嵌套子目录也能一并打包)"$dir"/*:指定要打包的是目标文件夹下的所有内容-xr!"$dir":排除目标文件夹本身,确保归档内不会保留原文件夹层级,直接存放文件
方法二:进入子目录后打包
for dir in */; do dir_name="${dir%/}" (cd "$dir" && 7z a "../$dir_name.7z" ./*) done
说明:
- 先进入目标子文件夹,再将当前目录下的所有文件打包到上级目录的同名7z文件中
- 这种方式天然避免了归档内出现原文件夹层级,因为打包的是当前目录(子文件夹内部)的内容
内容的提问来源于stack exchange,提问作者Wolf_
相关产品推荐
相关产品推荐

