关于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
中的命令,则target
002.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-files
、001.txt
和002.txt
不会被提取,并且目标保留其过时版本的001.txt
; - 使用
--keep-newer-files
,001.txt
会提取并覆盖现有目标文件,因为现有文件比存档中的文件旧,但002.txt
不会提取,因为现有文件比存档中的文件新。