ProgramingTip

tar : 파일을 업그레이드 됨 변경됨

bestdevel 2020. 12. 14. 20:39
반응형

tar : 파일을 업그레이드 됨 변경됨


나는 maketar백업을 사용 하고 있습니다. makefile을 사용할 때 tar 명령은 file changed as we read it. 이 경우

  • 경고가 모든 tar 패키지는 정상입니다.
  • 그러나 다음 백업에 대한 tar 명령을 중지합니다.
  • 실제로 경고를 표시하는 파일은 변경되지 않습니다. 경고가 표시되는 것이 정말 이상합니다.
  • 경고를 표시하는 파일이 무작위로 표시됩니다. 즉, makefile을 때마다 경고를 표시하는 파일이 있습니다.
  • --ignore-failed-read도움이되지 않습니다. MinGW에서 tar 1.23을 사용하고 있습니다.
  • 방금 컴퓨터를 WIN7 64 비트로 변경했습니다. 이 펼쳐는 이전 WIN7 32 비트에서 잘 작동합니다. 그러나 tar 버전은 1.23은 새로운 것은 아닙니다.

경고 후 백업을 중지하십시오.


편집 -2 : 이유 일 수 있습니다.

위에서 말했듯이 bash 쉘 펼쳐지는 이전 컴퓨터에서 잘 작동했습니다. 이전 컴퓨터와 비교하면 msys버전이 업데이트. tar 명령의 버전도 마찬가지입니다. 이전 컴퓨터에서 tar는 1.13.19이고 새 컴퓨터에서는 1.23입니다. msys-1.0.dll을 새 컴퓨터에 복사하지 않고 이전 tar 명령을 복사하고 이름을 tar_old로 변경했습니다. 또한 쉘 펼쳐서 tar 명령을 업데이트하고 펼쳐서 실행했습니다. 그러면 모든 것이 괜찮습니다. 그래서 문제는 tar 명령 인 것 가변합니다. 용기를 낼 때 변경된 파일이 확실합니다. 새 버전의 tar 명령에 대한 버그입니까? 모르겠어요.


편집 -1 : 세부 정보 추가

백업은 bash 쉘 펼쳐져 의해 호출됩니다. 대상 디렉토리를 스캔하고 makefile을 빌드 한 다음 백업을 위해 tar 명령을 사용하도록 make를 호출합니다. 다음은 bash 쉘 펼쳐보기 빌드 된 일반적인 메이크 파일입니다.

#--------------------------------------------
# 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

보시다시피 tar 패키지는 ~ / MS_bak_MSYS / tools / VC / VC_2010.tar.bz2에 저장됩니다. ~ / qqaa에서 펼쳐집니다. ~/MS_bak_MSYStar 명령에서 제외됩니다. 따라서 내가 만드는 타르 파일은 내가 타르 파일에있는 디렉토리 안에 있지 않습니다. 그렇기 때문에 경고가 나온 것이 이상하다는 것입니다.


또한 "읽는 동안 변경된"tar 메시지가 표시됩니다. 나에게 설치 메시지는 bitbake 빌드 환경에서 Linux 파일 시스템의 tar 파일을 만들 때 발생했습니다. 이 오류는 산발적이었습니다.

나에게 이것은 동일한 디렉토리에서 tar 파일을 생성했기 때문이 아닙니다. tar 파일 생성 중에 실제로 일부 파일을 덮어 쓰거나 변경했다고 가정합니다.

메시지는 경고이며 여전히 tar 파일을 작성합니다. 옵션을 설정하여 이러한 경고 메시지를 계속 억제 할 수 있습니다.

--warning=no-file-changed

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

여전히 tar가 반환하는 종료 코드는 경고 메시지의 경우 "1"입니다. http://www.gnu.org/software/tar/manual/html_section/Synopsis.html

따라서 스크립트의 일부 함수에서 tar 파일을 호출하는 경우 다음과 같이 종료 코드를 처리 할 수 ​​있습니다.

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

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

매우 늦었지만 최근에 같은 문제가 발생했습니다.

문제는 dir .xyz.tar.gz명령을 실행 한 후 생성 된 대로 변경 되기 때문 입니다. 두 가지 솔루션이 있습니다.

해결 방법 1 : tar 아카이브가 내부 디렉토리에 생성 되어도 상관 없습니다 .. 작업 공간 외부에서 아카이브를 만들 수없는 이유가있을 수 있습니다. 아카이브를 다음과 같이 저장하기위한 임시 디렉토리를 생성하여이 문제를 해결했습니다.

mkdir artefacts
tar -zcvf artefacts/archive.tar.gz --exclude=./artefacts .
echo $?
0

해결책 2 : 이것은 내가 좋아하는 것입니다. tar를 실행하기 전에 아카이브 파일을 만듭니다.

touch archive.tar.gz
tar --exclude=archive.tar.gz -zcvf archive.tar.gz .
echo $?
0

이와 같은 문제를 디버깅하는 데 도움이 필요하면 make 규칙 또는 최소한 호출 한 tar 명령을 제공해야합니다. 볼 명령이없는 경우 명령의 잘못된 점을 어떻게 알 수 있습니까?

그러나 99 %의 경우 이와 같은 오류는 tar 파일에 넣으려는 디렉토리 내에 tar 파일을 만들고 있음을 의미합니다. 따라서 tar가 디렉토리를 읽으려고 할 때 tar 파일을 디렉토리의 구성원으로 찾고이를 읽고 tar 파일에 기록합니다. 따라서 tar 파일을 읽기 시작하고 완료 될 때까지 tar 파일을 읽으면 tar 파일이 변경되었습니다.

예를 들면 다음과 같습니다.

tar cf ./foo.tar .

잘못이 아니기 때문에 이것을 "중지"할 방법이 없습니다. tar 파일을 만들 때 다른 곳에 --exclude두거나 tar 파일을 생략하는 다른 방법 ( 또는 기타 사용)을 찾으십시오 .


다음은 tar 종료 상태가 1 인 경우 무시하는 한 줄입니다. sandeep의 스크립트set +e 에서와 같이 할 필요가 없습니다 . tar 종료 상태가 0 또는 1이면이 한 줄은 종료 상태 0으로 반환됩니다. 그렇지 않으면 종료 상태 1로 반환됩니다. 이것은 원래 종료 상태 값이 1과 다른 경우 유지 되는 sandeep의 스크립트 와 다릅니다. .

tar -czf sample.tar.gz dir1 dir2 || [[ $? -eq 1 ]]


Fabian의 원 라이너를 향상시키기 위해; 종료 상태 1 만 무시하고 다른 경우 종료 상태를 유지하고 싶다고 가정 해 보겠습니다.

tar -czf sample.tar.gz dir1 dir2 || ( export ret=$?; [[ $ret -eq 1 ]] || exit "$ret" )

이것은 sandeep의 스크립트가하는 모든 것을 한 줄로 수행합니다.


출력을 위해 외부 디렉토리사용하기 만하면 문제가 해결되었습니다.

sudo tar czf ./../31OCT18.tar.gz ./

참고 URL : https://stackoverflow.com/questions/20318852/tar-file-changed-as-we-read-it

반응형