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


229

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

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

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

답변:


341

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


25
내가 사용해야했다mktemp -d -t <prefix>
Heath Borders

17
이것은 OS X 대 Linux입니다. 버전이 질문을 참조 그 모두에서 작동 : unix.stackexchange.com/questions/30091/...
jwhitlock

2
또한 Ortwin의 아래 답변을 참조하십시오. 그러면 정리도 완료됩니다.
Mathiasdm

5
"디렉토리를 사용한 후에는 반드시 디렉토리를 삭제해야합니다."라고 말하는 이유는 무엇입니까? 그것이 임시 디렉토리를 사용하는 목적을 무너 뜨리지 않습니까?
MK Safi

73

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

배쉬 트랩 .


26
FreeBSD주의! FreeBSD의에 mktemp는이 -p 옵션이 없습니다, 그리고 cleanup현재 디렉토리를 -rf RM은!
madfriend

1
좋은 지적은 temp dir을 만들 수 있는지 확인하기 위해 스크립트를 업데이트했습니다.
Ortwin Angermeier

1
@madfriend 정말? 경우 mktemp에 실패, WORK_DIR비어, 명령을 의미하는 것은 단지 것 rm -rf인수없이. 저는 FreeBSD를 사용하지 않지만 다음 rm -rf과 같은 경우 꽤 놀랐습니다rm -rf .
jbg

@ jbg 네, 나에게도 이상하게 보입니다. 정말 큰 문제는 아닙니다. 이 스크립트의 이전 버전을 조정하여 임시 디렉토리 경로를 현재 디렉토리에 상대적으로 계산하여 <s> 인종 멸종 </ s>으로 현재 디렉토리를 제거했습니다.
madfriend

1
더 나은 결과를 얻으려면 빈 디렉토리를 피하거나 적어도 TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')다음과 같은 솔루션을 사용하여 디렉토리 내에 문제를 포함시킬 수 있습니다 rmdir /tmp/git/"${TMPWORKDIR}". 변수가 지금 비어 있으면 여전히 /tmp/git/전체 시스템으로 돌아 가지 않습니다. 대답에서 이와 같은 것을 고려하면 기꺼이 동의합니다. ;)
Dr Beco

64

가장 좋아하는 라이너는

cd $(mktemp -d)

10
그리고 rm $(pwd)? : P
Arran Cudbard-Bell

19
또한 유용 : pushd $(mktemp -d)...popd
Ponkadoodle

4
ArranCudbard - 벨해야 @rm -r $(pwd)
piggybox

31
@piggybox 솔직히, 나는 매우 조심 해서 사용해야 rm -r $(pwd)합니다. 어떤 이유로 든 임시 디렉토리 작성이 실패 할 가능성을 고려하십시오 (/ tmp 파일 시스템이 가득 찼거나 오류로 인해 읽기 전용으로 다시 마운트되었을 수 있습니까?). 그런 다음 사용자의 홈 디렉토리에 대한 변경 사항을 cd $(mktemp -d)평가 한 후 cd삭제합니다.
Jules

1
다음과 같이 안전 할 수 있습니다if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
AndreyS Scherbakov

9

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

1
이것은 오류 처리를위한 흥미로운 솔루션이지만 장점과 가능한 단점에 대한 약간의 설명이 좋습니다.
머피

1.) -d디렉토리를 확인합니다. 2.) 종단은 이미 해당 신호의 기본값입니다.
ceving
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.