压缩文件夹,过程中某个文件有变化,会提示 file changed as we read it 。不太确定是压缩到这里就中断了,还是压缩完,才提示的这个错误。
测试一下
做个实验,验证一下。步骤如下:
- 创建一个空文件
- 用脚本不断往空文件写内容
- 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