Shell scripting (BASH) : How to create temporary random file name

by on March 23, 2005 · 12 comments· Last updated October 5, 2007

Various methods exists to create a random temporary file name. This is useful if your application/shell scripting needs temporary unique file names.

Method #1: Use of $RANDOM bash shell variable

1) At shell prompt type command:
# echo $RANDOM

You will get random value every time. This variable can be use to create unique file name as demonstrated by createtempfiles.bash script.

1) Download/view createtempfiles.bash script

2) Save the script to your computer and execute it as follows:
$ chmod +x random1.bash
$ ./random1.bash

Output:
/tmp/0.24101.txt
/tmp/0.28872.txt
/tmp/0.8457.txt
/tmp/0.18006.txt
/tmp/0.29528.txt

Use this method if your script needs more than two temporary files.

Method # 2 Use of $$ variable

This is old and classic method. $$ shell variable returns the current running process this can be use to create unique temporary file as demonstrated in following script:
vi random2.bash

#!/bin/bash
#
TFILE="/tmp/$(basename $0).$$.tmp"
ls > $TFILE
echo "See diretory listing in $TFILE"

Save the script and execute as follows:
$ chmod +x random2.bash
$ ./ random2.bash

Use this method if your script needs only ONE temporary file.

Method # 3 Use of mktemp or tempfile utility

As name suggest both makes unique temporary filename. Just type mktemp at shell prompt to create it:
$ mktemp
Output:
/tmp/tmp.IAnO5O
OR
$ tempfile
Output:
/tmp/IAnO5O

Make a unique temporary directory instead of a file using –d option to both of them
$ mktemp –d
$ tempfile –d

Both mktemp or tempfile provides the shell scripts facility to use temporary files in safe manner hence it is highly recommended to use them.



You should follow me on twitter here or grab rss feed to keep track of new changes.

Featured Articles:

{ 12 comments… read them below or add one }

1 surender July 24, 2007 at 6:03 am

how can i record the log in the log file in shell script?
like during running whatever the user is seeing, that should be recorded in log file.

Reply

2 vivek July 24, 2007 at 7:52 am
3 Artem Nosulchik October 5, 2007 at 8:17 am

createtempfiles.bash is missing… But article is still useful :)

Reply

4 vivek October 5, 2007 at 11:10 am

Artem,

Thanks for the heads up! The post has beeb updated.

Reply

5 Antti Kaihola September 24, 2008 at 8:25 am

$ tempfile -d does not create a temporary directory. Instead, it requires a directory as an argument and creates a temporary file inside that directory.

Reply

6 tnt2br October 30, 2008 at 6:46 pm

Thank’s. Obrigado ! Very good tutorial !

Reply

7 Anuj Aggarwal March 3, 2009 at 10:27 am

Hi

useful posts.
But i need to have filenames in sequence eachtime when i run the script in which i am creating the file.

Reply

8 CWS April 30, 2013 at 11:09 pm

This is very necro, but for others who find this rather high ranking search and want to create some “temp” files in sequence, you could do something like:

BASE=$(mktemp)
for a in {0..5}; do
cp $BASE $BASE.$a
done

That said, I really don’t understand why you’d care if they were in sequence.

Reply

9 Hai Vu May 21, 2009 at 5:08 pm

This article is very useful: it helps me solve my problem. Thank you.

Reply

10 David September 7, 2010 at 9:49 pm

After reading http://www.linuxsecurity.com/content/view/115462/151/ , I think some of your examples may be vulnerable to symlink attacks.

$RANDOM (once in the filename) or $$ alone are not enough because it may be possible for an attacker to create symlinks for all filenames.

Reply

11 Yuki Matsukura September 12, 2011 at 11:56 am

Great summary. Thank you.
It helps writing shell script!

Reply

12 Wesley April 19, 2013 at 8:15 am

mktemp /path/of/dorectory/filename.XXXXXX
The more X’s you add the more random characters it adds.

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <blockquote> <pre> <a href="" title="">
What is 15 + 13 ?
Please leave these two fields as-is:
Solve the simple math so we know that you are a human and not a bot.




Tagged as: , , ,

Previous post:

Next post: