임시 파일(배열의 이름) 생성/삭제 [닫기]

임시 파일(배열의 이름) 생성/삭제 [닫기]

안녕하세요. 임시 파일을 생성한 후 삭제하고 싶습니다. 배열에 변수 이름이 있습니다. 만들기는 잘 작동하지만 삭제하는 데 문제가 있습니다. 감사해요

FILES=( a b c d e f g h)

for i in "${FILES[@]}"; do
    eval "$i"=`mktemp`
done

답변1

Bash 쉘이 충분히 새로운 것(버전 4 이상)이라면 연관 배열을 사용하여 파일 이름을 저장하는 것이 좋습니다.

declare -A filenames
for i in "${FILES[@]}"; do
  filenames[$i]=$(mktemp)
done

작업이 완료되면 쉽게 삭제할 수 있습니다.

rm -- "${filenames[@]}"

답변2

당신이 원하는 것:

file_variables=(a b c d e f g h)
files=()
for var in "${file_variables[@]}"; do
  file=$(mktemp) || exit
  eval "$var=\$file"
  files+=("$file") # or files=("${files[@]}" "$file") with older versions
done

something with "$a"
something with "$g"...

rm -f -- "${files[@]}"

인용에 주의하세요. 예를 들어 $(mktemp)to 확장을 전달하는 대신 eval리터럴 문자열을 전달해야 합니다 $(mktemp). 에서는 bash대부분의 확장도 참조해야 합니다.

우리가 주목하는 유일한 것은 a=$file위에서 b=$file실행되는 입니다 eval. 왜냐하면 스칼라 변수에 할당될 때 분할+glob이 발생하지 않기 때문입니다. 우리처럼 files+=("$file").

답변3

내 생각에 가장 좋은 방법은 TEMP 디렉터리를 만든 다음 TEMP 디렉터리에 임시 파일을 만드는 것입니다. 이렇게 하면 다음과 같은 것을 사용하는 것에 대해 걱정할 필요 없이 임시 디렉토리의 모든 파일을 삭제할 수 있습니다.

rm ./TEMP/*

답변4

nameref(Bash 4+)를 사용할 수 있습니다.

declare -a names=( a b c d e )

for n in "${names[@]}"; do
  declare -n ref="$n"
  ref="$( mktemp )"
done

for n in "${names[@]}"; do
  declare -n ref="$n"
  test -f "$ref" && rm "$ref"
done

declare -nlocal -nnameref는 (or, or)를 사용하여 선언된 변수 입니다 typeset -n. nameref로 선언될 때 할당된 다른 변수의 이름입니다. 이후에는 nameref 변수가 nameref 생성 시 사용된 nameref 변수와 동일한 값으로 사용됩니다.

관련 정보