使用日期对tar文件进行命名

3
我想用日期来命名一个tar文件,但我尝试的方法不起作用。请看下面的代码以获得更好的解释,我该怎么做?
date=$( date +%Y-%m-%d_%H:%M:%S )
tar -czf ${imageName-$date}.tar.gz ${imageBasename} 2>>$ERRORLOG

图片名称是一个变量,用于存储图片的名称,例如:win-ser-rdp

我也尝试过:

tar -czf ${imageName}:${date}.tar.gz ${imageBasename} 2>>$ERRORLOG

很遗憾,它也没起作用 :(

感谢所有的帮助 :D


1
“没起作用”是什么意思?你收到错误信息了吗?如果有,请向我们展示。 - Keith Thompson
没有出现任何错误信息,终端只是停在了那一行的处理过程上。脚本停止了,我不得不按Ctrl+C。 - ranu
1
如果tar遇到一个形式为foo:bar的目标文件,它将假定它是主机foo上的远程文件bar。我不确定是否可以创建一个带有冒号的文件名。 - umläute
3个回答

14

问题在于文件名中的:字符,在GNU tar中会被特殊处理。

在我的系统上,我有一个名为foo的目录,我得到了这个错误:

$ tar zcf foo:42.tar.gz foo
tar (child): Cannot connect to foo: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now
$ 

似乎没有任何方法可以避免使用:字符,但是您可以通过使用--force-local选项来禁止其特殊解释(感谢Daniel Serodio指出)。

尽管文件名中的冒号字符是合法的,但通常不是一个好主意。例如,您可能无法通过scp访问文件。

这是GNU tar手册中相关的部分(输入info tar并转到第6.1节):

要在连接到远程机器的设备上指定存档文件,请使用以下命令:

--file=hostname:/dev/file-name

tar将尝试建立远程连接,并提示您输入用户名和密码。如果您使用--file=@hostname:/dev/file-name,tar将尝试使用您的用户名作为远程计算机上的用户名来建立远程连接。

当我制作包含时间戳的文件名时,我通常使用YYYY-MM-DD-HHMMSS

$(date +%F-%H%M%S)

如果您更喜欢的话,可以使用YYYY-MM-DD_HH_MM_SS

$(date +%F-%H_%M_%S)

感谢您对此的精彩解释!我已经找到了解决方案! - ranu
4
根据GNU tar手册:如果你需要使用一个文件名包含冒号的文件,可以使用"--force-local"选项来禁止远程磁带驱动器行为。 - Daniel Serodio

6
您的文件名和变量名不正确:
${imageName-$date}

应该是

${imageName}${date}

并且。
${imageName}:${date}.tar.gz

由于名称中含有冒号(:),因此将被解释为NFS位置,例如server:filename。请将冒号(:)替换为破折号(-)或其他非特殊字符。

当我尝试 ${imageName}:${date}.tar.gz 时,脚本返回一个错误:tar(child): Cannot connect to vm-win-rdp: resolve failed tar: Child returned status 128 tar: Error is not recoverable: exiting now - ranu
当我尝试使用${imageName}${date}时,它显示相同的错误消息,但第一行不是“无法连接到vm-win-rdp:解析失败”,而是显示:“无法连接到vm-win-rdp2013-10-16_12:解析失败”。 - ranu
“Resolve failed”? 听起来像是主机名不正确或 DNS 失败。在 tar 命令前面添加一个 echo,例如 echo tar .... 这样您就可以确切地看到您的脚本正在生成什么内容。 - Marc B
2
@RafaelNunes,每当你的脚本中有一个冒号(:)时,你就正在使用“互联网”来运行此脚本,因为这是告诉tar你想要访问远程资源的方式。由于${date}也包含冒号,这就是你遇到问题的原因... - umläute
谢谢,我的日期被定义为:date=$( date +%Y-%m-%d_%H:%M:%S ),所以我意识到这就是问题所在!非常感谢。 - ranu
显示剩余2条评论

1
尝试避免在tar文件名中使用冒号,因为这会使tar尝试输出到一个远程文件:
 date=$( date +%Y%m%d_%H%M%S )
 tar -czf ${imageName}-${date}.tar.gz ${imageBasename} 2>>${ERRORLOG}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接