I need to write a variable with "date" function and I need that the format is yyyymmdd (i.e. 20151031). Also I would remove a day (i.e. 20151031 becomes 20151030) I would use bash.


  • 2
    see man date. the date command allows you to format the output
    – Centimane
    Commented Nov 3, 2015 at 13:24
  • man date , and yesterday is: epoch - 86400 (seconds) Commented Nov 3, 2015 at 13:34

2 Answers 2


Use date +%Y%m%d to print the current date.
Use date --date '1 day ago' +%Y%m%d to print yesterday's date (GNU's date).
Use date -v -1d +Y%m%d (FreeBSD).

  • Ok, but if I put it into a variable I get error #!/usr/bin/env bash DATE=date --date '1 day ago' +%Y%m%d gunzip -c /var/log/cisco/cisco.log-echo $DATE.gz > /var/log/cisco/file.log root@raspberrypi:/etc/my_scripts# date --date date: option '--date' requires an argument
    – Federi
    Commented Nov 3, 2015 at 13:56
  • You have to enclose your command into $(). Example : DATE=$(date --date '1 day ago' +%Y%m%d)
    – Vinz
    Commented Nov 3, 2015 at 13:59

bash-4.2 and above have built-in support for that (inspired from something similar in ksh93):

printf -v now '%(%s)T' -1
printf '%(%Y%m%d)T\n' "$((now - 86400))"

Would print yesterday's date (well, the date 86400 seconds ago) in YYYYMMDD format. It may not work if run at certain hours of the night at the time of winter/summer time switch (when days are 23 or 25 hours long).

It would probably be more reliable for those corner cases if written as:

printf -v now '%(%s:%H)T' -1
printf '%(%Y%m%d)T\n' "$((${now%:*} - 3600 * (12 + ${now#*:})))"

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .