Есть несколько тонкостей, но в общем , вот разница:
По умолчанию 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
с усечением) .