답변:
사용하십시오 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 스크립트의 디렉토리 .
배쉬 트랩 .
cleanup
것 현재 디렉토리를 -rf RM은!
mktemp
에 실패, WORK_DIR
비어, 명령을 의미하는 것은 단지 것 rm -rf
인수없이. 저는 FreeBSD를 사용하지 않지만 다음 rm -rf
과 같은 경우 꽤 놀랐습니다rm -rf .
TMPWORKDIR=$(basename 'mktemp -d -p /tmp/git/')
다음과 같은 솔루션을 사용하여 디렉토리 내에 문제를 포함시킬 수 있습니다 rmdir /tmp/git/"${TMPWORKDIR}"
. 변수가 지금 비어 있으면 여전히 /tmp/git/
전체 시스템으로 돌아 가지 않습니다. 대답에서 이와 같은 것을 고려하면 기꺼이 동의합니다. ;)
가장 좋아하는 라이너는
cd $(mktemp -d)
rm $(pwd)
? : P
pushd $(mktemp -d)
...popd
rm -r $(pwd)
rm -r $(pwd)
합니다. 어떤 이유로 든 임시 디렉토리 작성이 실패 할 가능성을 고려하십시오 (/ tmp 파일 시스템이 가득 찼거나 오류로 인해 읽기 전용으로 다시 마운트되었을 수 있습니까?). 그런 다음 사용자의 홈 디렉토리에 대한 변경 사항을 cd $(mktemp -d)
평가 한 후 cd
삭제합니다.
if pushd $(mktemp -d || echo BADMPDIR); then ........ ; rm -r $(pwd); popd; fi
다음 스 니펫은 임시 디렉토리 ( -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
-d
디렉토리를 확인합니다. 2.) 종단은 이미 해당 신호의 기본값입니다.
mktemp -d -t <prefix>