261

を作成してtempfile削除し、ディレクトリとして再作成するために使用します。

temp=`tempfile`
rm -f $temp
  # <breakpoint>
mkdir $temp

問題は、<breakpoint>まで実行すると、同じことを実行しようとする別のプログラムがたまたまあり、同じ名前の一時ディレクトリをmkdir -ed すると、このプログラムが失敗することです。

4

5 に答える 5

393

を使用しmktemp -dます。ランダムな名前で一時ディレクトリを作成し、ファイルがまだ存在しないことを確認します。ただし、使用後はディレクトリを削除することを忘れないでください。

于 2011-01-08T02:30:15.623 に答える
90

より堅牢なソリューションについては、次のようなものを使用します。そうすれば、スクリプトが終了した後、一時ディレクトリは常に削除されます。

信号に対してクリーンアップ関数が実行され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スクリプトのディレクトリ。

バッシュトラップ

于 2016-01-08T11:35:52.633 に答える
75

これに対する私のお気に入りのワンライナーは

cd $(mktemp -d)
于 2014-02-04T21:46:38.203 に答える
17

次のスニペットは、一時ディレクトリを安全に作成してクリーンアップします。

最初のtrap行はexit 1、指定されたシグナルのいずれかが受信されたときにコマンドを実行します。2行目は、 on プログラムの終了 (正常と異常の両方) をtrap削除します。不明な状態で誤って終了トラップを実行することを避けるために、成功したこと$TMPDIRを確認した後、これらのトラップを初期化します。mkdir -d$TMPDIR

#!/bin/bash

# ---    

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

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

# Make sure temp directory gets removed on script exit.
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
于 2018-10-30T11:45:24.233 に答える
2

ここでは、テンプレートを使用して一時ディレクトリを作成する方法について簡単に説明します。

  1. 一時ファイルまたはディレクトリを安全に作成し、その名前を出力します。
  2. TEMPLATE の最後のコンポーネントには、少なくとも 3 つの連続した「X」が含まれている必要があります。
  3. TEMPLATE が指定されていない場合は、tmp.XXXXXXXXXX が使用されます。
  4. 作成されるディレクトリは、u+rwx から umask 制限を引いたものです。

PARENT_DIR=./temp_dirs # (optional) specify a dir for your tempdirs
mkdir $PARENT_DIR

TEMPLATE_PREFIX='tmp' # prefix of your new tempdir template
TEMPLATE_RANDOM='XXXX' # Increase the Xs for more random characters
TEMPLATE=${PARENT_DIR}/${TEMPLATE_PREFIX}.${TEMPLATE_RANDOM}

# create the tempdir using your custom $TEMPLATE, which may include
# a path such as a parent dir, and assign the new path to a var
NEW_TEMP_DIR_PATH=$(mktemp -d $TEMPLATE)
echo $NEW_TEMP_DIR_PATH

# create the tempdir in parent dir, using default template
# 'tmp.XXXXXXXXXX' and assign the new path to a var
NEW_TEMP_DIR_PATH=$(mktemp -p $PARENT_DIR)
echo $NEW_TEMP_DIR_PATH

# create a tempdir in your systems default tmp path e.g. /tmp 
# using the default template 'tmp.XXXXXXXXXX' and assign path to var
NEW_TEMP_DIR_PATH=$(mktemp -d)
echo $NEW_TEMP_DIR_PATH

# Do whatever you want with your generated temp dir and var holding its path

于 2021-01-25T03:47:00.247 に答える