ディレクトリ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
「前」を取得します。
ファイルが読み取り専用に設定されているため、これが発生するのは論理的ではありません。なぜそれが起こるのですか?
Tarは既存の読み取り専用ファイルを上書きせず、削除してから同じ名前の新しいファイルを作成しました。これは、-xが機能する方法の結果です。これは、既存のアーカイブにファイルを追加する古い増分バックアップ方法に対応するために、設計によりファイルの既存のバージョンを置き換えます。 tarアーカイブには、複数のバージョンのファイルが含まれている場合があります。抽出が完了すると、最後の1つだけがディスクに表示されます。これの副作用は、ファイルがアーカイブに1回しか表示されない場合でも、tarがファイルの既存のコピーも削除することです。
ファイルを削除できないという事実は、読み取り専用に設定されているファイルのアクセス許可ではなく、親ディレクトリのアクセス許可に依存します。
あなたが持っているとき ディレクトリへの書き込みアクセス、自分でそれらのファイルを所有していない場合でも、そのディレクトリ内の読み取り専用ファイルを削除できます( リンク )。
# 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