Tar 覆盖只读文件

Tar 覆盖只读文件

我创建了目录test1.txt在中创建了文件test,并在该文件中写入了“之前”。然后我就去了

cd ..

并使用命令:

tar -cvzf ./test.tgz ./test

然后我再次进入测试目录。1.txt再次打开文件。将内容更改为“之后”。我保存了文件并通过执行以下命令将 chmod 更改为只读:

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

相关内容