何时强制使用 tar 命令的“--keep-newer-files”选项?

何时强制使用 tar 命令的“--keep-newer-files”选项?

关于tar命令

介绍

例如有:

source
 numbers
  001.txt # with the 111 content
  002.txt # with the 222 content
  003.txt # with the 333 content

numbers.tar.gz如果通过命令创建文件tar -czf numbers.tar.gz numbers,那么现在我们有:

source
 numbers.tar.gz
 numbers
  001.txt # with the 111 content
  002.txt # with the 222 content
  003.txt # with the 333 content

考虑mv numbers.tar.gz target命令是否被执行,因此我们有:

target
 numbers.tar.gz

如果tar -xzf numbers.tar.gz命令被执行,那么我们有

target
 numbers.tar.gz
 numbers
  001.txt # with the 111 content
  002.txt # with the 222 content
  003.txt # with the 333 content

因此,作为总体概述,我们有:

source
 numbers.tar.gz
 numbers
  001.txt # with the 111 content
  002.txt # with the 222 content
  003.txt # with the 333 content
target
 numbers.tar.gz
 numbers
  001.txt # with the 111 content
  002.txt # with the 222 content
  003.txt # with the 333 content

优先控制

让我们假设以下简单更新:

target
 numbers.tar.gz
 numbers
  001.txt # with the 111 content
  002.txt # with the 222222 content <--- updated
  003.txt # with the 333 content

如果执行目录tar -xzf numbers.tar.gz中的命令,则target002.txt,则文件为被覆盖,所以它的 222222 内容返回到 222。直到这里我都还好。

为了保证新数据的安全或避免不需要的覆盖,可以使用--keep-old-files--skip-old-files选项,根据tar(1) - Linux 手册页,它表示:

-k, --keep-old-files
don't replace existing files when extracting, treat them as errors
--skip-old-files
don't replace existing files when extracting, silently skip over them

因此对于执行以下两个命令:

tar --keep-old-files -xzf numbers.tar.gz
tar --skip-old-files -xzf numbers.tar.gz

发生以下情况:

  • 前者始终显示tar: numbers/222.txt: Cannot open: File exists错误消息并且数据保持安全(保留为 222222)
  • 后者什么也不显示 - 例外是如果v使用该选项 - 它显示tar: numbers/222.txt: skipping existing file消息;并且数据保持安全(保留为 222222)。对于脚本目的很有用。

到这里为止,一切都很好。

经过研究后我发现--keep-newer-files选项,并再次按照tar(1) - Linux 手册页,它表示:

--keep-newer-files
don't replace existing files that are newer than their archive copies

因此对于执行以下命令:

tar --keep-newer-files -xzf numbers.tar.gz

发生以下情况:

  • 出现该tar: Current ‘numbers/222.txt’ is newer or same age消息并且数据保持安全(保留为 222222)

实际上,此选项的作用与避免覆盖--keep-newer-files相同--skip-old-files显示不同的消息。

问题

  • 什么时候强制使用命令--keep-newer-files的选项tar而不是--keep-old-files--skip-old-files选项?

我想知道在什么特定场景下这个选项是强制的。

答案1

--keep-newer-files如果您想保留对目标所做的更改,则非常有用源文件是最后修改的,并用源中的较新版本替换目标上的所有旧版本。

为了说明这两个选项之间的区别,您需要另一条信息,即每个文件的时间戳。考虑以下:

source
  numbers
    001.txt # timestamp t1, contents 1
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333

复制这些文件以target保留其时间戳。

source
  numbers
    001.txt # timestamp t1, contents 1
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333
target
  numbers
    001.txt # timestamp t1, contents 1
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333

现在你001.txt修复来源(观察t2部分):

source
  numbers
    001.txt # timestamp t2, contents 111
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333
target
  numbers
    001.txt # timestamp t1, contents 1
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333

也有人002.txt编辑目标(观察t3部分):

source
  numbers
    001.txt # timestamp t2, contents 111
    002.txt # timestamp t1, contents 222
    003.txt # timestamp t1, contents 333
target
  numbers
    001.txt # timestamp t1, contents 1
    002.txt # timestamp t3, contents 22222
    003.txt # timestamp t1, contents 333

您创建一个新存档,并将其解压到目标上:

  • 如果没有任何选项,所有文件都会被提取,因此目标最终会在源中获得相同的内容001.txt,从而丢失对目标002.txt所做的更改;002.txt
  • with --keep-old-files001.txt002.txt不会被提取,并且目标保留其过时版本的001.txt;
  • 使用--keep-newer-files,001.txt会提取并覆盖现有目标文件,因为现有文件比存档中的文件旧,但002.txt不会提取,因为现有文件比存档中的文件新。

相关内容