Shell脚本如何去除变量中的./前缀 解决tar创建空归档报错问题
问题修复方案
核心问题说明
你遇到的报错有两个原因:
tar命令参数顺序错误,且未指定要打包的目标目录:-f参数必须紧跟生成的归档文件名,且你没有把要压缩的目标文件夹路径作为参数传给tar,才会提示「拒绝创建空归档」- 去除变量开头的
./前缀可以直接用Shell原生参数扩展实现,不需要额外调用外部命令
具体修改方法
- 去除
./前缀:使用${变量名#./}即可删除变量开头匹配的./字符串 - 修正
tar命令的参数顺序,补全要打包的源路径 - 修正脚本开头的shebang拼写错误(原脚本少了
!)
修正后的完整脚本
#!/bin/sh BASEDIR=/tmp/ cd "$BASEDIR" || exit 1 find . -type d | sort > newfiles.txt DIFF=$(comm -13 oldfiles.txt newfiles.txt) echo "$DIFF" if [ -n "$DIFF" ] then # 去除./前缀 DIR_NAME=${DIFF#./} # 修正tar命令:-f后跟文件名,最后补要打包的源目录 tar -czvf "${DIR_NAME}.tar.gz" "$DIFF" fi mv newfiles.txt oldfiles.txt
额外注意事项
如果同时存在多个新增目录,直接把comm的结果赋值给单个变量会出现异常,可以改成循环处理每一行新增目录:
#!/bin/sh BASEDIR=/tmp/ cd "$BASEDIR" || exit 1 find . -type d | sort > newfiles.txt # 循环处理每个新增目录 comm -13 oldfiles.txt newfiles.txt | while read -r DIR do [ -z "$DIR" ] && continue DIR_NAME=${DIR#./} tar -czvf "${DIR_NAME}.tar.gz" "$DIR" done mv newfiles.txt oldfiles.txt
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

