這裡介紹如何使用 Linux 的 mktemp 指令,自動建立檔名不重複的暫存檔案或目錄,方便程式或指令稿存放資料。

有時候在撰寫程式或是指令稿時,會需要建立暫存檔來存放暫時性的資料,直覺的作法是在特定的目錄下,以亂數的方式來命名暫存檔,並檢查是否有檔名重複的問題,雖然產生亂數暫存檔的實作不會很複雜,但若有現成可用的工具,當然會更方便。


Linux 的 mktemp 指令就是一個專門用來產生暫存檔案或目錄的小工具,它會以亂數命名的方式暫存檔案或目錄,並傳回檔案或目錄的路徑。

建立暫存檔

mktemp 預設會自動以亂數建立一個空的暫存檔:

# 建立暫存檔
MY_TEMP_FILE=`mktemp`

執行了 mktemp 指令之後,建會建立一個暫存檔,並且傳回檔案路徑,接著我們就可以使用這個建立好的暫存檔案了:

# 查看暫存檔
ls -l ${MY_TEMP_FILE}
-rw------- 1 gtwang gtwang 0  5月  9 21:06 /tmp/tmp.K058cGnZVp

而在使用完之後,記得要將這個暫存檔刪除:

# 刪除暫存檔
rm ${MY_TEMP_FILE}

建立暫存目錄

有時候我們的程式會需要好多的暫存檔,用來儲存不同的資料,這種狀況下就可以考慮直接建立一個暫存目錄,在這個目錄中自己建立多的檔案來使用:

# 建立暫存目錄
MY_TEMP_DIR=`mktemp -d`

mktemp 在建立暫存目錄後,會傳回目錄的路徑,接著我們就可以在這個暫存目錄中,自由建立多個檔案了。

# 查看暫存目錄
ls -ld ${MY_TEMP_DIR}
drwx------ 2 gtwang gtwang 4096  5月 15 16:47 /tmp/tmp.fbjDb2oPUY

在這個暫存目錄之下,我們就可以很放心使用固定的檔案名稱,不用擔心跟其他程式衝突:

# 在暫存目錄中建立檔案
echo "Hello" > ${MY_TEMP_DIR}/a.txt
echo "World" > ${MY_TEMP_DIR}/b.txt

使用完畢之後,就直接把整個暫存目錄刪除即可:

# 刪除暫存目錄
rm -fr ${MY_TEMP_DIR}

指定暫存檔放置路徑

在預設的狀況下,mktemp 會將暫存檔案(或目錄)放在系統的 /tmp 之中,如果想要改變放置的位置,可以加上 -p 參數並指定放置位置:

# 在 /home/gtwang/tmp 目錄下建立暫存檔
MY_TEMP_FILE=`mktemp -p /home/gtwang/tmp`

若要更改暫存目錄的放置位置,方法也相同:

# 在 /home/gtwang/tmp 目錄下建立暫存目錄
MY_TEMP_DIR=`mktemp -d -p /home/gtwang/tmp`

指定暫存檔檔名格式

mktemp 預設會用 tmp.XXXXXXXXXX 這樣的格式來命名暫存檔(或暫存目錄),若要自己指定檔名格式,方便辨識暫存檔是由哪個程式產生的,可以執行 mktemp 時,加上檔名的樣板:

# 自行指定檔名格式
MY_TEMP_DIR=`mktemp /tmp/my_temp_file_XXXXXX.txt`

在指定檔名的樣板時,一定要包含好幾個 Xmktemp 會把這些 X 自動替換成亂數產生的字母,避免產生重複的檔名。另外也要注意必須加上檔案的路徑,否則暫存檔會直接建立在目前的目錄之下。