我需要对文件进行备份,并且我希望将时间戳作为名称的一部分,以便于区分。
如何将当前日期注入复制命令中?
[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory
[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory
[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory
答案1
这不起作用,因为该命令date
返回一个包含空格的字符串。
$ date
Wed Oct 16 19:20:51 EDT 2013
如果您确实想要这样的文件名,则需要将该字符串括在引号中。
$ touch "foo.backup.$(date)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013
不过,我的猜测是,您可能正在考虑附加不同的字符串。我通常使用这样的东西:
$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25
请参阅日期的手册页有关日期和时间输出的更多格式化代码。
附加格式
如果您想完全控制,如果您查阅手册页,您可以执行以下操作:
$ date +"%Y%m%d"
20131016
$ date +"%Y-%m-%d"
2013-10-16
$ date +"%Y%m%d_%H%M%S"
20131016_193655
笔记:您可以使用date -I
ordate --iso-8601
来产生与 相同的输出date +"%Y-%m-%d
。该开关还能够采取指示各种时间格式的参数:
$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
- ‘hours’
- ‘minutes’
- ‘date’
- ‘seconds’
- ‘ns’
Try 'date --help' for more information.
例子:
$ date -Ihours
2019-10-25T01+0000
$ date -Iminutes
2019-10-25T01:21+0000
$ date -Iseconds
2019-10-25T01:21:33+0000
答案2
cp foo.txt {,.backup.`date`}
这扩展到类似的东西cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013
。大括号之前的空格开始一个新单词。
cp foo.txt {,.backup. $((date)) }
大括号是单独的单词,因此它们按字面意思解释。此外,$((…))
是算术扩展的语法;的输出date
与算术表达式完全不同。命令替换使用一组括号:$(date)
。
cp foo.txt foo.backup.`date`
更近一点。您可以用大括号将其表示为cp foo.{txt,.backup.`date`}
。仍然存在输出包含空格的问题date
,因此需要将其放在双引号内。这会起作用:
cp foo.{txt,backup."`date`"}
或者
cp foo.{txt,backup."$(date)"}
默认输出格式date
不太适合文件名,如果语言环境使用/
默认输出格式中的字符,它甚至可能无法工作。使用 YMD 日期格式,以便文件名的字典顺序是时间顺序(也可以避免美国和国际日期格式之间的歧义)。
cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}
答案3
如果您确实想使用详细日期,则应该保护反引号。这种日期格式的缺点是它嵌入了空格,这在 Unix shell 中是禁忌,除非将它们放在引号内(或以其他方式转义它们)。
cp foo.txt "foo-`date`.txt"
不过,我更喜欢使用较短的 ISO 格式:
cp foo.txt foo-`date --iso`.txt
答案4
由于默认情况下date
其输出中存在空格,您的上一个命令失败了。如果您引用了 with 中的最后一个参数"
,它应该可以工作。你的其他尝试只是语法错误
这是一个没有空格的可能解决方案:
cp foo.txt foo.backup.$(date --iso-8601=seconds)
或者
cp foo.txt foo.backup.`date --iso-8601=seconds`
如果你添加
bk() {
cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}
到你.bashrc
并重新登录/让你的 bash 重新读取它,你只需要调用bk file.txt
.