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

Shell脚本如何去除变量中的./前缀 解决tar创建空归档报错问题

问题修复方案

核心问题说明

你遇到的报错有两个原因:

  1. tar命令参数顺序错误,且未指定要打包的目标目录:-f参数必须紧跟生成的归档文件名,且你没有把要压缩的目标文件夹路径作为参数传给tar,才会提示「拒绝创建空归档」
  2. 去除变量开头的./前缀可以直接用Shell原生参数扩展实现,不需要额外调用外部命令

具体修改方法

  1. 去除./前缀:使用${变量名#./}即可删除变量开头匹配的./字符串
  2. 修正tar命令的参数顺序,补全要打包的源路径
  3. 修正脚本开头的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:03