Tar перезаписывает файлы только для чтения

Вы должны переименовать, в то время как существуют подобные инструменты, которые могли служить Вам также:

touch x1 x2 x10 x11 x101 
ls ; rename 's/x/x0/' x[0-9] 

x1 x10 x101 x11 x2

ls ; rename 's/x/x0/' x[0-9][0-9] 

x01 x02 x10 x101 x11

ls

x001 x002 x010 x011 x101

'переименуйте' часть некоторого пакета жемчуга, если необходимо установить его, по крайней мере, доступный для Linux.

Без переименовывают, существует аналогичное решение с циклом:

rm * 
touch x1 x2 x10 x11 x101
for f in  x[0-9] ; do mv $f ${f/x/x0}; done 
for f in  x[0-9][0-9] ; do mv $f ${f/x/x0}; done ; ls 

x001 x002 x010 x011 x101

4
28.02.2012, 11:34
2 ответа

Tar не перезаписывал существующий файл только для чтения, он удалил его и затем создал новый файл с тем же именем. Это - последствие пути-x работы; это заменяет существующие версии файла дизайном для размещения старого метода инкрементного резервного копирования добавления файлов в существующий архив. Архив tar мог бы иметь несколько версий файла в нем; только последний появится на диске после того, как извлечение будет завершено. Побочный эффект этого состоит в том, что tar также удаляет существующие копии файлов, даже если они появляются только однажды в архиве.

6
27.01.2020, 20:51
  • 1
    Спасибо за Ваш ответ, Kyle Jones. Таким образом, я буду использовать - исключают опцию исключить файлы, я не хочу быть перезаписанным. –  Jakub 28.02.2012, 03:30

То, что файл не может быть удален, не зависит от полномочий файла, устанавливаемых на только для чтения, но на полномочиях родительского каталога.

Когда у Вас есть доступ для записи к каталогу, можно удалить файлы только для чтения в том каталоге, даже если Вы не владеете теми файлами сами (ссылка).

# 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
27.01.2020, 20:51

Теги

Похожие вопросы