Append Current Date To Filename in Bash Shell

last updated in Categories , ,

How do I append current date (mm_dd_yyyy format) to a filename (e.g., backup_mm_dd_yyyy.sql) under Linux and UNIX like operating systems? How can I append a current date from a variable to a filename under Linux or Unix bash shell? How do I append date to filename?

We use the date command to show or set the system date and time. Further we can show the current date and time in the given FORMAT. This page explains how to append current date to a filename using various command line options.

Advertisements

Append current date to a filename

To get the current date in mm_dd_yyyy format use the following date format syntax:

date +"%FORMAT_STRING"
date +"%m_%d_%Y"
date +"%Y-%m-%d"

You can store this to a variable name:

var=$(date +"%FORMAT_STRING")
now=$(date +"%m_%d_%Y")
printf "%s\n" $now
today=$(date +"%Y-%m-%d")
printf "Today we are going to backup file to NFS server at AWS '%s'\n" "/efs/my-blog-${today}.sql.tar.gz"

Sample outputs:

Today we are going to backup file to NFS server at AWS '/efs/my-blog-2020-02-29.sql.tar.gz'

Alternat syntax for command substitution is as follows:

var=`date +"%FORMAT_STRING"`
now=`date +"%m_%d_%Y"`
now=`date +"%Y-%m-%d"`
echo "${now}"

Sample outputs:

2020-02-29

Now we can append the current date stored in $now to a filename as follows:
echo "Coping data to /tmp/filename-${now} ..."

date command FORMAT_STRING

FORMAT_STRING (FORMAT) controls the output. Interpreted sequences are as follows (taken from GNU/date man page)

  • %a – locale’s abbreviated weekday name (e.g., Sun)
  • %A – locale’s full weekday name (e.g., Sunday)
  • %b – locale’s abbreviated month name (e.g., Jan)
  • %B – locale’s full month name (e.g., January)
  • %C – century; like %Y, except omit last two digits (e.g., 20)
  • %d – day of month (e.g., 01)
  • %D – date; same as %m/%d/%y
  • %F – full date; same as %Y-%m-%d
  • %g – last two digits of year of ISO week number (see %G)
  • %G – year of ISO week number (see %V); normally useful only with %V
  • %H – hour (00..23)
  • %I – hour (01..12)
  • %j – day of year (001..366)
  • %m – month (01..12)
  • %M – minute (00..59)
  • %n – a newline
  • %N – nanoseconds (000000000..999999999)
  • %p – locale’s equivalent of either AM or PM; blank if not known
  • %P – like %p, but lower case
  • %q – quarter of year (1..4)
  • %r – locale’s 12-hour clock time (e.g., 11:11:04 PM)
  • %R – 24-hour hour and minute; same as %H:%M
  • %s – seconds since 1970-01-01 00:00:00 UTC
  • %S – second (00..60)
  • %T – time; same as %H:%M:%S
  • %u – day of week (1..7); 1 is Monday
  • %U – week number of year, with Sunday as first day of week (00..53)
  • %V – ISO week number, with Monday as first day of week (01..53)
  • %w – day of week (0..6); 0 is Sunday
  • %W – week number of year, with Monday as first day of week (00..53)
  • %x – locale’s date representation (e.g., 12/31/99)
  • %X – locale’s time representation (e.g., 23:13:48)
  • %y – last two digits of year (00..99)
  • %Y – year
  • %z – +hhmm numeric time zone (e.g., -0400)
  • %:z – +hh:mm numeric time zone (e.g., -04:00)
  • %::z – +hh:mm:ss numeric time zone (e.g., -04:00:00)
  • %:::z – numeric time zone with : to necessary precision (e.g., -04, +05:30)
  • %Z – alphabetic time zone abbreviation (e.g., EDT)

Bash shell append date to filename in Linux or Unix

Finally, you can create a filename as follows:

#/bin/bash
now=$(date +"%m_%d_%Y")
echo "Filename : /nas/backup_$now.sql"

Sample outputs:

Filename : /nas/backup_04_27_2010.sql

How do I add date to filename?

Here is a quick demo:
Linux Append Current Date To Filename in Bash Shell

Append current date to filename shell script

You can create a shell script as follows:

#!/bin/bash
#
# Backup mysql/mariadb database
 
## Get current date ##
_now=$(date +"%m_%d_%Y")
 
## Appending a current date from a $_now to a filename stored in $_file ##
_file="/nas/backup_$_now.sql"
 
## Do it ##
echo "Starting backup to $_file..."
mysqldump -u admin -p'myPasswordHere'  myDbNameHere > "$_file"
 
## Add more stuff below ##

Conclusion

You learned how to add the date to a filename under Linux or Unix-like operating systems. For further information type the following man command:
man date

ADVERTISEMENTS

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Notable Replies

  1. Hi!
    I just wonder why do you use underscore to name your variables.
    Thanks

  2. @Nordri

    No reasons. You can use - and any other valid characters. For example, the following in not a valid filename:

    now=$(date +"%m/%d/%Y")
    file="/tmp/backup-${now}"
    ## the following is going to fail ##
    touch "${file}"
    ls -l /tmp/backup*
    

    But - would work:

    now=$(date +"%Y-%m-%d") 
    file="/tmp/backup-${now}"
    touch "${file}"
    ls -l /tmp/backup*
    

    HTH

Continue the discussion www.nixcraft.com

Participants

Historical Comment Archive

19 comment

  1. Thank you, just used this to save a version of my thesis every time I compile the .tex into a .pdf.

  2. This is not working for me.
    It always says “date: zusätzlicher Operand „%Y-%m-%d“”, which means “date: extra operand „%Y-%m-%d“” or something like that.

    here is my script:

    #!/bin/bash
    current_date=$(date + "%Y-%m-%d)
    file="/mnt/Daten/piBackup/Arch${current_date}.img"
    echo "Starting backup to $file..."
    dd bs=1M if=/dev/mmcblk0 |pv| dd of=$file
    

    You know what i’ve done wrong?

    1. There should not be a whitespace between + and the format string on line 3. Change $(date + “%Y-%m-%d”) to $(date +”%Y-%m-%d”).

  3. Great blog post! Thank you very much!

    I wrote the following script to save the screenshots with date and time in the filename similar as in Mac OS X:

    #!/bin/bash
    echo "Taking screenshot via adb from connected Android device..."
    dateAndTime=$(date +"%Y-%m-%d at %H.%M.%S")
    filename="ADB Screen $dateAndTime.png"
    adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > "$filename"
    echo "Successfully saved screenshot to $filename"
    exit 0
    
  4. You can also avoid the bash shell altogether and put the one line in your crontab like:

    mysqldump --user=[user] --password=[pass] Database>Database_`date +"%m%d%y"`.sql
  5. Try this on for size, in bash:

         bkup ()
         {
              ## shell function, placed in your profile
              STAMP=`date +%m%d%y-%H%M%S`
              cp -i ${1}{,.${BKUP_DATE_STAMP}}
         }
    <pre>
     
    Place the above function in your .profile or .bash_profile or .bashrc. Wherever you like or paste it into a command line on the terminal.  Then use it like this:
    <pre>
         touch name.conf
         bkup  name.conf

    To check and see if it worked,

         ls -l name.conf*
    

    The advantage to this approach is that if you are backing up a file in a subdirectory:

         bkup /path/to/the/file/name.conf
         ls -l   /path/to/the/file/name.conf*
    

    Outputs:

         -rw-r--r-- 1 unixDude unixDude 0 Sep 13 21:21 /path/to/the/file/name.conf
         -rw-r--r-- 1 unixDude unixDude 0 Sep 13 21:23 /path/to/the/file/name.conf.091314-211838
    

    Now, the challenge is to backup the file and then vi it or what you will, within the same function.

    1. ERROR:

      STAMP=`date +%m%d%y-%H%M%S`

      should be:

      BKUP_DATE_STAMP=`date +%m%d%y-%H%M%S`

      Or, what you want as long as it matches.

  6. I am very newbie about bash.
    Why there’s a plus sign in front of the pattern?
    date +"%m_%d_%Y"

    Thanks

  7. How do you put a string and the date in one line, e.g.
    MyDate='Mystring' date +"%Y-%m-%d_%H.%m"
    echo $MyDate

    I know it’s not working, but how do you do that?

    Still, have a question? Get help on our forum!