Как создать временный каталог? - PullRequest
207 голосов
/ 08 января 2011

Я использую для создания tempfile, удаления и воссоздания его в качестве каталога:

tmpnam=`tempfile`
rm -f $tmpnam
mkdir "$tmpnam"

Проблема в том, что другой процесс может получить такое же имя X, если он случайно выполнит tempfileпосле одного процесса rm -f X и только до mkdir X.

Ответы [ 4 ]

315 голосов
/ 08 января 2011

Использование mktemp -d. Он создает временный каталог со случайным именем и гарантирует, что файл не существует. Вы должны помнить, чтобы удалить каталог после его использования.

65 голосов
/ 08 января 2016

Для более надежного решения я использую что-то вроде следующего.Таким образом, временный каталог всегда будет удаляться после выхода из скрипта.

Функция очистки выполняется для сигнала EXIT.Это гарантирует, что функция очистки вызывается всегда, даже если скрипт где-то прерывается.

#!/bin/bash    

# the directory of the script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# the temp directory used, within $DIR
# omit the -p parameter to create a temporal directory in the default location
WORK_DIR=`mktemp -d -p "$DIR"`

# check if tmp dir was created
if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
  echo "Could not create temp dir"
  exit 1
fi

# deletes the temp directory
function cleanup {      
  rm -rf "$WORK_DIR"
  echo "Deleted temp working directory $WORK_DIR"
}

# register the cleanup function to be called on the EXIT signal
trap cleanup EXIT

# implementation of script starts here
...

Каталог скрипта bash из здесь .

Bash traps.

56 голосов
/ 05 февраля 2014

Мой любимый однострочник для этого -

cd $(mktemp -d)
7 голосов
/ 30 октября 2018

Следующий фрагмент безопасно создаст временный каталог (-d) и сохранит его имя в TMPDIR.(Пример использования переменной TMPDIR показан ниже в коде, где она используется для хранения исходных файлов, которые могут быть изменены.)

Первая строка trap выполняет команду exit 1, когда любой изуказанные сигналы получены.Вторая строка trap удаляет (очищает) $TMPDIR при выходе из программы (как нормальную, так и ненормальную).Мы инициализируем эти ловушки после того, как проверим, что mkdir -d удалось избежать случайного выполнения выходной ловушки с $TMPDIR в неизвестном состоянии.

#!/bin/bash

# Create a temporary directory and store its name in a variable ...
TMPDIR=$(mktemp -d)

# Bail out if the temp directory wasn't created successfully.
if [ ! -e $TMPDIR ]; then
    >&2 echo "Failed to create temp directory"
    exit 1
fi

# Make sure it gets removed even if the script exits abnormally.
trap "exit 1"           HUP INT PIPE QUIT TERM
trap 'rm -rf "$TMPDIR"' EXIT

# Example use of TMPDIR:
for f in *.csv; do
    cp "$f" "$TMPDIR"
    # remove duplicate lines but keep order
    perl -ne 'print if ++$k{$_}==1' "$TMPDIR/$f" > "$f"
done
...