75

I want add the date next to a filename ("somefile.txt"). For example: somefile_25-11-2009.txt or somefile_25Nov2009.txt or anything to that effect

Maybe a script will do or some command in the terminal window. I'm using Linux(Ubuntu).

The script or command should update the filename to a new date everytime you want to save the file into a specific folder but still keeping the previous files. So there would be files like this in the folder eventually: filename_18Oct2009.txt , filename_9Nov2009.txt , filename_23Nov2009.txt

starball
  • 20,030
  • 7
  • 43
  • 238
sami
  • 867
  • 1
  • 8
  • 13
  • 14
    You may want yyyy-mm-dd instead of dd-mm-yyyy to get lexicographical sort of file names to also sort them chronologically. – laalto Nov 25 '09 at 09:40

7 Answers7

102

Info/Summary

With bash scripting you can enclose commands in back ticks or parantheses. This works great for labling files, the following wil create a file name with the date appended to it.

Methods

Backticks -

$ echo myfilename-"`date +"%d-%m-%Y"`"

$(parantheses) - :

$ echo myfilename-$(date +"%d-%m-%Y")

Example Usage:

echo "Hello World" > "/tmp/hello-$(date +"%d-%m-%Y").txt"

(creates text file '/tmp/hello-28-09-2022.txt' with text inside of it)

Note, in Linux quotes are your friend, best practice to enclose the file name to prevent issues with spaces and such in variables.

Mike Q
  • 6,716
  • 5
  • 55
  • 62
miku
  • 181,842
  • 47
  • 306
  • 310
53

There's two problems here.

1. Get the date as a string

This is pretty easy. Just use the date command with the + option. We can use backticks to capture the value in a variable.

$ DATE=`date +%d-%m-%y` 

You can change the date format by using different % options as detailed on the date man page.

2. Split a file into name and extension.

This is a bit trickier. If we think they'll be only one . in the filename we can use cut with . as the delimiter.

$ NAME=`echo $FILE | cut -d. -f1
$ EXT=`echo $FILE | cut -d. -f2`

However, this won't work with multiple . in the file name. If we're using bash - which you probably are - we can use some bash magic that allows us to match patterns when we do variable expansion:

$ NAME=${FILE%.*}
$ EXT=${FILE#*.} 

Putting them together we get:

$ FILE=somefile.txt             
$ NAME=${FILE%.*}
$ EXT=${FILE#*.} 
$ DATE=`date +%d-%m-%y`         
$ NEWFILE=${NAME}_${DATE}.${EXT}
$ echo $NEWFILE                 
somefile_25-11-09.txt                         

And if we're less worried about readability we do all the work on one line (with a different date format):

$ FILE=somefile.txt  
$ FILE=${FILE%.*}_`date +%d%b%y`.${FILE#*.}
$ echo $FILE                                 
somefile_25Nov09.txt
David Webb
  • 190,537
  • 57
  • 313
  • 299
  • Thanks Dave but How or where do i run this script? Forgive me i'm new with Linux. – sami Nov 25 '09 at 10:35
  • Can you give some more details on precisely what you want to do. So you have a file in a directory which you want to date stamp in this way. Is it just one file with the same name each time or could it be a number of files with a number of different name? – David Webb Nov 25 '09 at 10:47
  • I'm still not clear on what you want to do. It says the script should update the filename "everytime you want to save the file into a specific folder". What is saving the file into the folder? Where is it coming from? – David Webb Nov 25 '09 at 11:00
  • If you want to have the filename changed everytime somebody saves something to a certain directory, then you'll need some filesystem monitor. Have a look at inotify (man inotify); you should be able to build something that way. – kkeller Nov 24 '13 at 14:58
  • Thank you so much. This helped – Sanket Mehta Oct 11 '19 at 15:52
25
cp somefile somefile_`date +%d%b%Y`
Soufiane Hassou
  • 17,257
  • 2
  • 39
  • 75
13

You can add date next to a filename invoking date command in subshell.

date command with required formatting options invoked the braces of $() or between the backticks (`…`) is executed in a subshell and the output is then placed in the original command.

The $(...) is more preferred since in can be nested. So you can use command substitution inside another substitution.

Solutions for requests in questions

$ echo somefile_$(date +%d-%m-%Y).txt
somefile_28-10-2021.txt

$ echo somefile_$(date +%d%b%Y).txt
somefile_28Oct2021.txt

The date command comes with many formatting options that allow you to customize the date output according to the requirement.

  • %D – Display date in the format mm/dd/yy (e.g. : 10/28/21)
  • %Y – Year (e.g. : 2021)
  • %m – Month (e.g. : 10)
  • %B – Month name in the full string format (e.g. : October)
  • %b – Month name in the shortened string format (e.g. : Oct)
  • %d – Day of month (e.g. : 28)
  • %j – Day of year (e.g. : 301)
  • %u – Day of the week (e.g. : 4)
  • %A – Weekday in full string format (e.g. : Thursday)
  • %a – Weekday in shortened format (e.g. : Thu)
anoopknr
  • 3,177
  • 2
  • 23
  • 33
5

I use this script in bash:

#!/bin/bash

now=$(date +"%b%d-%Y-%H%M%S")
FILE="$1"
name="${FILE%.*}"
ext="${FILE##*.}"

cp -v $FILE $name-$now.$ext

This script copies filename.ext to filename-date.ext, there is another that moves filename.ext to filename-date.ext, you can download them from here. Hope you find them useful!!

tatojo
  • 226
  • 6
  • 11
  • 1
    This is exactly what I needed, and I like the GitHub repo with the complete examples! – Jaap Jun 01 '21 at 17:49
4

I use it in raspberry pi, and the first answer doesn't work for me, maybe because I typed wrong or something? I don't know. So I combined the above answers and came up with this:

now=$(date +'%Y-%m-%d')
geany "OptionalName-${now}.txt"

That if you want to use geany or anything else

enter image description here enter image description here

0

a bit more convoluted solution that fully matches your spec

echo `expr $FILENAME : '\(.*\)\.[^.]*'`_`date +%d-%m-%y`.`expr $FILENAME : '.*\.\([^.]*\)'`

where first 'expr' extracts file name without extension, second 'expr' extracts extension

catwalk
  • 6,340
  • 25
  • 16