programing

임시 디렉터리를 만들려면 어떻게 해야 합니까?

newsource 2023. 4. 25. 22:27

임시 디렉터리를 만들려면 어떻게 해야 합니까?

을(를) 만들곤 합니다.tempfile를 삭제하고 디렉토리로 다시 만듭니다.

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

문제는 <breakpoint>까지 실행될 때, 같은 작업을 수행하려는 다른 프로그램이 있다는 것입니다. 같은 이름의 tempdir를 mkdir-ed하면 이 프로그램이 실패할 수 있습니다.

를 사용합니다. 임의 이름으로 임시 디렉터리를 만들고 해당 파일이 이미 존재하지 않는지 확인합니다.그러나 디렉토리를 사용한 후에는 삭제해야 합니다.

보다 강력한 솔루션을 위해 다음과 같은 방법을 사용합니다.이렇게 하면 스크립트가 종료된 후 temp dir가 항상 삭제됩니다.

정리 기능은 다음에서 실행됩니다.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 스크립트의 디렉터리입니다.

배쉬 트랩이요

제가 제일 좋아하는 원라이너는요.

cd $(mktemp -d)

다음 스니펫은 임시 디렉터리를 안전하게 만든 다음 정리합니다.

첫 번째는요trap라인이 실행됩니다.exit 1지정된 신호 중 하나가 수신 시 명령을 실행합니다.두 번째는요trap선은 다음을 제거합니다.$TEMPD프로그램 종료 시(정상 및 비정상 모두)에 표시됩니다.이 트랩을 초기화하려면 다음 사항을 확인해야 합니다.mkdir -d다음을 사용하여 실수로 종료 트랩을 실행하는 것을 방지했습니다.$TEMPD알 수 없는 상태에 있습니다.

#!/bin/bash

# set -x # un-comment to see what's going on when you run the script

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

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

# Make sure the temp directory gets removed on script exit.
trap "exit 1"           HUP INT PIPE QUIT TERM
trap 'rm -rf "$TEMPD"'  EXIT

다음은 템플릿을 사용하여 temp dir를 생성하는 방법에 대한 간단한 설명입니다.

  1. 임시 파일 또는 디렉터리를 안전하게 생성하고 이름을 인쇄합니다.
  2. TEMPLATE은(는) 마지막 구성 요소에 3개 이상의 연속된 'X'를 포함해야 합니다.
  3. TEMPLATE을 지정하지 않으면 tmp를 사용합니다.XXXXXXXXXXXXX입니다.
  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

다음과 같은 기능이 필요합니다.

  • 재사용할 수 있도록 모든 임시 파일을 특정 네임스페이스가 있는 단일 디렉터리에 넣습니다.
  • 파일 이름 접두사 및 접미사(확장자)를 사용하여 임시 파일을 만듭니다.

와 함께bashmacOS에서 스크립트를 실행합니다.


$ namespace="com.namespace.mktemp"

# find directory for reusing
$ ls -d "${TMPDIR}${namespace}"*

# create directory if not exists
$ mktemp -d -t "$namespace"
/var/folders/s_/.../T/com.namespace.mktemp.HjqGT6w2

# create tempfile with directory name and file prefix
$ mktemp -t "com.namespace.mktemp.HjqGT6w2/file-prefix"
/var/folders/s_/.../T/com.namespace.mktemp.HjqGT6w2/file-prefix.sZDvjo14

# add suffix - `mktemp` on macOS does not support `--suffix`
mv "/var/folders/s_/.../file-prefix.sZDvjo14" "/var/folders/s_/.../file-prefix.sZDvjo14.txt"

gmktemp(brew install coreutils)는 조금 다릅니다.

  • 지원합니다.--suffix그리고.--tmpdir
  • X는 다음 항목에 필요합니다.template그리고.prefix
  • template디렉터리를 포함할 수 없습니다. 설정TMPDIR대신

$ namespace="com.namespace.gmktemp"

# create directory if not exists
$ gmktemp -d -t "$namespace.XXXXXXXX"
/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ

# set TMPDIR
TMPDIR="/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ"

# create tempfile with directory name and file prefix
$ gmktemp --suffix=".txt" -t "prefix.XXXXXXXX"
/var/folders/s_/.../T/com.namespace.gmktemp.BjFtIAyZ/prefix.LWHj0G95.txt

언급URL : https://stackoverflow.com/questions/4632028/how-to-create-a-temporary-directory 입니다.