私はディレクトリを作成し、test
その1.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