web-dev-qa-db-ja.com

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

ディレクトリtestを作成し、testにファイル1.txtを作成し、このファイルに「Before」と書き込みました。それから私は行った

cd ..

次のコマンドを使用しました。

tar -cvzf ./test.tgz ./test

次に、テストディレクトリを再度入力しました。 1.txtファイルを再度開きました。コンテンツを「変更後」に変更しました。ファイルを保存し、chmodを次のコマンドを実行して読み取り専用に変更しました。

chmod -w ./1.txt

したがって、今のところ、私の1.txtは読み取り専用です。それから私は上がる

cd ..

test.tgzアーカイブを抽出します。

tar -xvzf ./test.tgz

次に、もう一度dirをテストします。

cat 1.txt

「前」を取得します。

ファイルが読み取り専用に設定されているため、これが発生するのは論理的ではありません。なぜそれが起こるのですか?

4
Jakub

Tarは既存の読み取り専用ファイルを上書きせず、削除してから同じ名前の新しいファイルを作成しました。これは、-xが機能する方法の結果です。これは、既存のアーカイブにファイルを追加する古い増分バックアップ方法に対応するために、設計によりファイルの既存のバージョンを置き換えます。 tarアーカイブには、複数のバージョンのファイルが含まれている場合があります。抽出が完了すると、最後の1つだけがディスクに表示されます。これの副作用は、ファイルがアーカイブに1回しか表示されない場合でも、tarがファイルの既存のコピーも削除することです。

6
Kyle Jones

ファイルを削除できないという事実は、読み取り専用に設定されているファイルのアクセス許可ではなく、親ディレクトリのアクセス許可に依存します。

あなたが持っているとき ディレクトリへの書き込みアクセス、自分でそれらのファイルを所有していない場合でも、そのディレクトリ内の読み取り専用ファイルを削除できます( リンク )。

# 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
1
chad