tar: file changed as we read it

makefile, tar

Solution

I also encounter the tar messages "changed as we read it". For me these message occurred when I was making tar file of Linux file system in bitbake build environment. This error was sporadic.

For me this was not due to creating tar file from the same directory. I am assuming there is actually some file overwritten or changed during tar file creation.

The message is a warning and it still creates the tar file. We can still suppress these warning message by setting option

`--warning=no-file-changed`

(http://www.gnu.org/software/tar/manual/html_section/warnings.html )

Still the exit code return by the tar is "1" in warning message case: http://www.gnu.org/software/tar/manual/html_section/Synopsis.html

So if we are calling the tar file from some function in scripts, we can handle the exit code something like this:

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

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

Problem

I am using `make` and `tar` to backup. When executing makefile, tar command shows `file changed as we read it`. In this case, - the tar package is ok when the warning comes up - but it stops the tar command for the following backup - the file showing the warning in fact doesn't change -- it is really strange that the warning comes up - the files showing the warning come up randomly, I mean, everytime I run my makefile, the files showing the warning are different - `--ignore-failed-read` doesn't help. I am using tar 1.23 in MinGW - I just changed my computer to WIN7 64 bit. The script works well in old WIN7 32 bit. But the tar version is not as new as the 1.23. How can I stop the tar's warning to stop my backup following the warning? Edit-2: it might be the reason As I said above, the bash shell script worked well in my old computer. Comparing with the old computer, the `msys` version is different. So is the version of tar command. In the old computer, tar is 1.13.19 and it is 1.23 in the new computer. I copied the old tar command without copying its dependency msys-1.0.dll to the new computer and renamed it tar_old. And I also updated the tar command in the shell script and run the script. Then everything is ok. So, it seemed that the problem is the tar command. I am sure that there is no any file changed when taring. Is it a bug for tar command in new version? I don't know. Edit-1: add more details The backup is invoked by a bash shell script. It scans the target directory and builds makefile then invokes make to use tar command for backup. Followed is a typical makefile built by the bash shell script. ``` #-------------------------------------------- # backup VC #-------------------------------------------- # the program for packing PACK_TOOL=tar # the option for packing tool PACK_OPTION=cjvf # M$: C driver WIN_C_DIR=c: # M$: D driver WIN_D_DIR=d: # M$: where the software is WIN_PRG_DIR=wuyu/tools # WIN_PRG_DIR= # where to save the backup files BAKDIR=/home/Wu.Y/MS_bak_MSYS VC_FRAMEWORK=/home/Wu.Y/MS_bak_MSYS/tools/VC/VC_framework.tar.bz2 VC_2010=/home/Wu.Y/MS_bak_MSYS/tools/VC/VC_2010.tar.bz2 .PHONY: all all: $(VC_FRAMEWORK) $(VC_2010) $(VC_FRAMEWORK): $(WIN_C_DIR)/$(WIN_PRG_DIR)/VC/Framework/* @$(PACK_TOOL) $(PACK_OPTION) "$@" --ignore-failed-read /c/$(WIN_PRG_DIR)/VC/Framework $(VC_2010): $(WIN_C_DIR)/$(WIN_PRG_DIR)/VC/VS2010/* @$(PACK_TOOL) $(PACK_OPTION) "$@" --ignore-failed-read /c/$(WIN_PRG_DIR)/VC/VS2010 ``` As you can see, the tar package is stored in ~/MS_bak_MSYS/tools/VC/VC_2010.tar.bz2. I run the script in ~/qqaa. `~/MS_bak_MSYS` is excluded from tar command. So, the tar file I am creating is not inside a directory I am trying to put into tar file. This is why I felt it strange that the warning came up.

Original source