How to append date to backup file

This isn't working because the command date returns a string with spaces in it.

$ date
Wed Oct 16 19:20:51 EDT 2013

If you truly want filenames like that you'll need to wrap that string in quotes.

$ 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

You're probably thinking of a different string to be appended would be my guess though. I usually use something like this:

$ 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

See the man page for date for more formatting codes around the output for the date & time.

Additional formats

If you want to take full control if you consult the man page you can do things like this:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

NOTE: You can use date -I or date --iso-8601 which will produce identical output to date +"%Y-%m-%d. This switch also has the ability to take an argument to indicate various time formats:

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
  - ‘hours’
  - ‘minutes’
  - ‘date’
  - ‘seconds’
  - ‘ns’
Try 'date --help' for more information.

Examples:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

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

This expands to something like cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. The space before the braces starts a new word.

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

The braces are in separate words, so they are interpreted literally. Furthermore, $((…)) is the syntax for arithmetic expansion; the output of date is nothing like an arithmetic expression. Command substitution uses a single set of parentheses: $(date).

cp foo.txt foo.backup.`date`

Closer. You could have expressed this with braces as cp foo.{txt,.backup.`date`}. There is still the problem that the output of date contains spaces, so it needs to be put inside double quotes. This would work:

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

or

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

The default output format of date is not well-suited to a file name, and it might even not work if a locale uses / characters in the default output format. Use a Y-M-D date format so that the lexicographic order on file names is the chronological order (and also to avoid ambiguity between US and international date formats).

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

If you really want to use the verbose date, you should protect the backtick. The with this date format is that it has embedded spaces, a no-no in a Unix shell unless you put them inside quotes (or escape them some other way).

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

However, I prefer to use the shorter ISO format:

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

Tags:

Shell

Date

Cp