что фактически делает (или не делает) tar - overwrite? - PullRequest
0 голосов
/ 26 июня 2018

Я вижу, что в Linux tar есть опция --overwrite. Но перезапись, кажется, по умолчанию. Более того, указание tar --no-overwrite не меняет это поведение, как, по-видимому, предлагает информационный файл.

Так что же делает эта опция?

Я проверяю это с

ls -l >junk
ls -l junk
tar -cf junk.tar junk
>junk
ls -l junk
tar  <option?> -xf junk.tar  # option varies, results do not
ls -l junk

1 Ответ

0 голосов
/ 26 июня 2018

Есть несколько тонкостей, но в общем , вот разница:

По умолчанию tar пытается открыть выходные файлы с флагами O_CREAT | O_EXCL. Если файл существует, произойдет сбой, после чего «tar» будет повторять попытку, сначала пытаясь удалить существующий файл, а затем снова открывая его с теми же флагами (т. Е. Создавая новый файл).

В отличие от этого, с параметром --overwrite tar пытается открыть выходные файлы с флагами O_CREAT | O_TRUNC. Если файл существует, он будет обрезан до нулевого размера и перезаписан.

Основным выводом является то, что tar по умолчанию удаляет и воссоздает существующие файлы, поэтому они получают новые номера инодов. С --overwrite номера инодов не изменятся:

$ ls -li foo
total 0
5360222 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
$ tar -cf foo.tar foo
$ tar -xf foo.tar  # inode will change
$ ls -li foo
total 0
5360224 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
$ tar --overwrite -xf foo.tar  # inode won't change
$ ls -li foo
total 0
5360224 -rw-rw-r-- 1 buhr buhr 0 Jun 26 15:16 bar
$ 

Это также означает, что для каждого перезаписанного файла «tar» по умолчанию потребуется три системных вызова (open, unlink, open), в то время как --overwrite потребуется только один (open с усечением) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...