如何将日期附加到备份文件


69

我需要备份文件,并且我希望将时间戳记作为名称的一部分,以使其易于区分。

您如何将当前日期注入复制命令?

[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

Answers:


108

这不起作用,因为该命令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

+1-我始终对日期使用格式说明符,即“%Y%m%d-%H%M%S”或“%y%m%d-%H%M%S”。
ChuckCottrill

只是touch foo`date +%F`也很好。
Vadzim 2014年

警告:这在cshShell中不起作用
Govinda Sakhare

1
@GovindaSakhare -csh / tcsh将子外壳符号切换为反引号(...)而不是$(..)。C外壳显然不支持子外壳的这种表示法。
slm

13
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`}。仍然存在问题of的输出date包含空格,因此需要将其放在双引号中。这将工作:

cp foo.{txt,backup."`date`"}

要么

cp foo.{txt,backup."$(date)"}

默认输出格式date不适用于文件名,如果语言环境使用/默认输出格式的字符,它甚至可能不起作用。使用YMD日期格式,以便文件名的字典顺序是按时间顺序排列的(并且还要避免美国和国际日期格式之间的歧义)。

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

最后一个给了我cp:目标`foo..backup.20160913-134158'不是目录
Kalpesh Soni

@KalpeshSoni我发布的确切命令无法产生此错误消息。您必须使用其他命令。
吉尔斯(Gilles)2016年

10

如果您确实要使用冗长的日期,则应保护反引号。此日期格式的格式是它具有嵌入的空间,在Unix shell中不能有空格,除非您将其放在引号内(或以其他方式转义)。

cp foo.txt "foo-`date`.txt"

但是,我更喜欢使用较短的ISO格式:

cp foo.txt foo-`date --iso`.txt

5

使用一个功能,它将使您的生活更轻松。这是我用的:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

如同date默认情况下在其输出中包含空格一样,您的最后一条命令失败。如果您在中引用了最后一个参数",则该参数应该起作用。您的其他尝试语法有误

这里是没有空格的可能解决方案:

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


我的RHEL日期手册没有显示--iso-8601切换,因此我将链接放在此处。GNU日期选项:--iso-8601
Ivan Chau

3

您将文件复制到名称带有附加时间戳的备份文件中

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

要么:

您可以使用“ cat”显示文件的内容,并将输出重定向到名称带有附加时间戳记的备份文件

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

您还可以根据需要使用更多FORMAT控件选项,例如:%H,%M,%S等。


cat重定向的优势是什么cp
Guido

这只是这样做的另一种方法
Atul Rokade '16

1

在bash中,您可以输入:

cp /path/to/long/filename !#$_$(date +Is)

扩展为:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

导致:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

牛肉在date -Is。我喜欢使用它,因为它很容易记住,键入并允许使用简短的版本(例如,-In如果您非常喜欢)。


! 启动事件指示符:

 !#     The entire command line typed so far.

并且$是一个单词指示符:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

1

当我必须备份文件时,通常只需要这样做。

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
这没有增加其他答案尚未提出的内容。此外,%F日期格式会产生两位数的月份,ls -l通常会提供比文件名更多的信息。
库沙兰丹

0

如果只想备份文件或目录,那么为什么还要键入目标,只需使用Shell扩展将日期添加到副本文件名的末尾即可。

cp filename.sh{,."`date`"}

导致

filename.sh.Sun 29 Sep 00:44:43 BST 2019

或简单地使用

cp filename{,.20190929}

filename.sh.20190929

附加日期以适合您的需求。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.