Tar는 읽기 전용 파일을 덮어씁니다.

Tar는 읽기 전용 파일을 덮어씁니다.

나는 디렉토리를 만들고 test1.txt안에 파일을 만들고 test그 파일에 "이전"을 썼습니다. 그럼 나는 갔다

cd ..

다음 명령을 사용하십시오.

tar -cvzf ./test.tgz ./test

그런 다음 다시 테스트 디렉토리로 이동합니다. 1.txt파일을 다시 엽니다. 내용을 '이후'로 변경합니다. 파일을 저장하고 다음을 실행하여 읽기 전용으로 chmoded했습니다.

chmod -w ./1.txt

이제 내 1.txt것은 읽기 전용입니다. 그럼 난 올라갈게

cd ..

test.tgz아카이브를 추출하십시오 .

tar -xvzf ./test.tgz

그런 다음 다시 테스트 디렉토리로 이동하여

cat 1.txt

"이전"을 얻으십시오.

파일이 읽기 전용으로 설정되어 있기 때문에 이런 일이 발생하는 것은 비논리적입니다. 왜 이런 일이 발생합니까?

답변1

Tar는 기존 읽기 전용 파일을 덮어쓰지 않고 삭제하고 동일한 이름의 새 파일을 생성합니다. 이는 -x 작동 방식의 결과입니다. 기존 아카이브에 파일을 추가하는 기존 증분 백업 방법을 수용하기 위해 설계상 기존 파일 버전을 대체합니다. tar 아카이브에는 여러 버전의 파일이 포함될 수 있습니다. 추출이 완료된 후에는 마지막 버전만 디스크에 나타납니다. 이것의 부작용은 파일이 아카이브에 한 번만 나타나더라도 tar가 파일의 기존 복사본도 삭제한다는 것입니다.

답변2

파일을 삭제할 수 없다는 사실은 읽기 전용으로 설정된 파일 권한에 따라 달라지는 것이 아니라 상위 디렉터리의 권한에 따라 달라집니다.

너가 가질 때디렉토리에 대한 쓰기 액세스, 해당 디렉토리의 읽기 전용 파일을 직접 소유하지 않은 경우에도 삭제할 수 있습니다(협회).

# file removal test
(
mkdir -p test
echo hello > test/file.txt
chmod -w test
chmod -w test/file.txt
sudo chown root:wheel test/file.txt
#sudo chflags uchg test/file.txt
ls -ld test test/file.txt
rm -fv test/file.txt
echo
chmod 700 test  # set write permission
ls -ld test test/file.txt
rm -fv test/file.txt
)

test위의 예에서 디렉터리에 대한 쓰기 권한을 제거하면 gnutar(Mac OS X에서) 실패하고 test/1.txt다음과 같은 오류가 발생합니다.

# gnutar: ./test/1.txt: Cannot open: File exists
# gnutar: Exiting with failure status due to previous errors
# After

tartest() {
   dirperms="$1"
   mkdir -p test
   [[ -f test/1.txt ]] && chmod +w test/1.txt
   echo "Before" > test/1.txt
   gnutar -czf ./test.tgz ./test
   echo "After" > test/1.txt
   chmod -w test/1.txt
   chmod "${dirperms}" test
   gnutar -xzf ./test.tgz
   cat test/1.txt
   return 0
}

tartest 755
tartest 555

관련 정보