Tarは読み取り専用ファイルを上書きします。

Tarは読み取り専用ファイルを上書きします。

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

関連情報