[bash] 임시 디렉토리를 만드는 방법은 무엇입니까?

을 만들고 tempfile삭제하고 디렉토리로 다시 만드는 데 사용합니다 .

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

문제는 다른 프로세스가 X실수로 한 프로세스 이후 rm -f X와 직전에 임시 파일을 실행하는 경우 동일한 이름을 얻을 수 있다는 것 mkdir X입니다.



답변

사용하십시오 mktemp -d. 임의의 이름으로 임시 디렉토리를 작성하고 파일이 존재하지 않는지 확인하십시오. 그래도 디렉토리를 사용한 후에는 반드시 삭제해야합니다.


답변

더 강력한 솔루션을 위해 다음과 같은 것을 사용합니다. 이렇게하면 스크립트가 종료 된 후 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)


답변

다음 스 니펫은 임시 디렉토리 ( -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


답변