создание / удаление временных файлов (имена в массиве) [закрыто]

-1
02.03.2017, 17:36
4 ответа

Думаю, лучше всего будет создать каталог TEMP, а затем создать временные файлы в каталоге TEMP. Таким образом, вы можете без проблем удалить все файлы во временном каталоге, используя что-то вроде

rm ./TEMP/*
0
28.01.2020, 05:07

Вы хотите:

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[@]}"

Обратите внимание на цитирование. Например, в eval следует передавать не расширение $(mktemp), а литеральную строку $(mktemp). В bash большинство расширений также нужно заключать в кавычки.

Единственные, которые мы заключаем в кавычки, это a=$file, b=$file, которые выполняются eval выше, поскольку split+glob не происходит (не может произойти) при присваивании скалярным переменным. Кавычки нужны для присваивания переменным массива, как в нашем files+=("$file").

1
28.01.2020, 05:07

Вы можете использовать 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

nameref - это переменная, которая была объявлена ​​с помощью declare -n (или local -n , или typeset -n ). Имя другой переменной присваивается ей после объявления ее как nameref. После этого использование значения переменной nameref будет таким же, как использование значения переменной с именем при создании nameref.

0
28.01.2020, 05:07

Если ваша оболочка bash достаточно новая (версия 4+), то я бы рекомендовал использовать ассоциативный массив для хранения имен файлов:

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

Тогда их легко удалить, когда вы закончите:

rm -- "${filenames[@]}"
2
28.01.2020, 05:07

Теги

Похожие вопросы