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

by on March 23, 2005 · 13 comments· LAST UPDATED October 5, 2007

in , ,

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.

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 13 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 nixCraft 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 nixCraft 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

13 Hal September 24, 2013 at 9:04 pm

Suggest that you list the preferred method first rather than last.

Reply

Leave a Comment

Tagged as: , , ,

Previous post:

Next post: