我创建了目录test
,1.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