tar压缩提示file changed as we read it

压缩文件夹,过程中某个文件有变化,会提示 file changed as we read it 。不太确定是压缩到这里就中断了,还是压缩完,才提示的这个错误。

测试一下

做个实验,验证一下。步骤如下:

  1. 创建一个空文件
  2. 用脚本不断往空文件写内容
  3. tar打包压缩脚本以及建的文件

脚本命名为echo.sh,内容如下:

num=1
while true
do
        echo $num >> test.txt
        num=$num+1
        #sleep 30s
done

打包压缩test.txt和echo.sh,压缩的命令:

tar -czvf tar_test.tgz test.txt echo.sh

执行命令的结果:

[wang@DESKTOP-K8UBC7R test]$ tar -czvf tar_test.tgz test.txt echo.sh
test.txt
tar: test.txt: file changed as we read it
echo.sh

可以看到过程,得到tar_tet.tgz后解压,看一下是否包含echo.sh:

[wang@DESKTOP-K8UBC7R tar_test]$ ls
echo.sh  tar_test.tgz  test.txt

确定包含echo.sh,所以根据现象反推,应该只是一个提示。也就是没有变动的文件,会被打包成功,有变动的文件,肯定只能打包了当时的那些内容。

资料1

找到了这篇文章 https://blog.csdn.net/w892824196/article/details/109494061 ,文中提到的观点验证了上面的结论。即:

即使打包命令执行过程中会有这个报错提示,但实际上还是会正常生成tar包,并且也是可用的。

既然不影响,那么可以忽略这个报错,只需要在tar命令中加入一个参数:

[wang@DESKTOP-K8UBC7R test]$ tar --warning=no-file-changed -czvf tar_test.tgz test.txt echo.sh
test.txt
echo.sh
wang@DESKTOP-K8UBC7R test]$

可以看到,执行不再报错。

同时,文中还提到tar有三种退出码:

0 - Successful termination.
1 - Some files differ.
2 - Fatal error

明显我们遇到的就是退出码为1的情况。

资料2

还看到了这个资料 https://stackoverflow.com/questions/20318852/tar-file-changed-as-we-read-it

里面也提到了打包是成功的,同时也提到了退出码,当我们加上 --warning=no-file-changed 的时候,退出码还是1,只是不报错而已。

也可以自己加一些判断条件,来看一下结果:

set +e 
tar -czf sample.tar.gz dir1 dir2
exitcode=$?

if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
    exit $exitcode
fi
set -e

另外,如果本身不想打包那个会变化的文件,只需要把他排除掉就好了,如下:

touch archive.tar.gz
tar --exclude=archive.tar.gz -zcvf archive.tar.gz .

另附官方关于warnings的说明 https://www.gnu.org/software/tar/manual/html_section/warnings.html

posted @ 2022-08-16 15:20  wswang  阅读(9533)  评论(0编辑  收藏  举报