Bash 如何创建临时目录?
我使用创建Bash 如何创建临时目录?,bash,temporary-directory,Bash,Temporary Directory,我使用创建tempfile,删除它并将其重新创建为目录: temp=`tempfile` rm -f $temp # <breakpoint> mkdir $temp temp=`tempfile` rm-f$temp # mkdir$temp 问题是,当它运行到时,恰好有另一个程序想要执行相同的操作,这将导致该程序失败。使用。它使用随机名称创建一个临时目录,并确保该文件不存在。不过,您需要记住在使用目录后删除它。我最喜欢的一行是 cd $(mktemp -d) 为了获得
tempfile
,删除它并将其重新创建为目录:
temp=`tempfile`
rm -f $temp
# <breakpoint>
mkdir $temp
temp=`tempfile`
rm-f$temp
#
mkdir$temp
问题是,当它运行到时,恰好有另一个程序想要执行相同的操作,这将导致该程序失败。使用。它使用随机名称创建一个临时目录,并确保该文件不存在。不过,您需要记住在使用目录后删除它。我最喜欢的一行是
cd $(mktemp -d)
为了获得更健壮的解决方案,我使用了如下内容。这样,在脚本退出后,temp dir将始终被删除 清除功能在退出信号上执行。这保证了总是调用cleanup函数,即使脚本在某个地方中止
#!/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脚本的目录
猛击 以下代码片段将安全地创建一个临时目录(
-d
),并将其名称存储到TMPDIR
中。(代码后面将显示TMPDIR
变量的一个示例,该变量用于存储可能修改的原始文件。)
当接收到任何指定的错误时,第一行执行exit 1
命令。第二个陷阱
行删除(清除)程序退出时的$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
下面是关于如何使用模板创建临时目录的简单说明
父目录=./temp目录#(可选)为tempdir指定一个目录
mkdir$PARENT_DIR
TEMPLATE_PREFIX='tmp'#新tempdir模板的前缀
模板_RANDOM='XXXX'#增加Xs以获得更多随机字符
TEMPLATE=${PARENT\u DIR}/${TEMPLATE\u PREFIX}.${TEMPLATE\u RANDOM}
#使用自定义$TEMPLATE创建tempdir,其中可能包括
#一个路径,如父目录,并将新路径分配给变量
新的目录路径=$(mktemp-d$模板)
echo$NEW\u TEMP\u DIR\u路径
#使用默认模板在父目录中创建tempdir
#“tmp.xxxxxxxxx”并将新路径分配给变量
新目录路径=$(mktemp-p$父目录)
echo$NEW\u TEMP\u DIR\u路径
#在系统默认tmp路径中创建tempdir,例如/tmp
#使用默认模板“tmp.xxxxxxxxx”并将路径分配给var
新建临时目录路径=$(mktemp-d)
echo$NEW\u TEMP\u DIR\u路径
#使用生成的temp dir和var保持其路径,可以执行任何操作
我不得不使用mktemp-d-t
这是OSX与Linux的较量。查看这个问题,了解一个同时适用于这两个版本的版本:另外,请参阅下面Ortwin提供的答案,因为这样可以确保也完成了清理。为什么您会说“您需要记住在使用该目录后删除该目录?”?这不是有点违背了使用临时目录的目的吗?@M.K.Safi我认为主要目的是创建一个空目录,在那里可以存储临时文件,而不会弄乱文件系统的其他部分。您可以选择是否/何时删除它。如果它在/tmp中创建它,那么在系统重新启动时应该清除它。并且rm$(pwd)
?:Palso有用:pushd$(mktemp-d)
popd
@ArranCudbard-Bell应该是rm-r$(pwd)
@piggybox坦白地说,我会非常谨慎地使用rm-r$(pwd)
。考虑临时目录创建失败的可能性(无论T/TMP文件系统是满的还是可能由于错误而重新安装只读)?然后cd$(mktemp-d)
将计算为cd
,该值将更改为用户的主目录,随后将被删除。使用if pushd$(mktemp-d | echo BADMPDIR)可能是安全的;然后;rm-r$(pwd);popd;fi
FreeBSD小心!FreeBSD上的mktemp没有-p选项,cleanup
将rm-rf您当前的目录!很好,更新了脚本以检查是否可以创建临时目录。@真的吗?如果mktemp
失败,WORK\u DIR
将为空,这意味着命令将是rm-rf
,没有参数。我不使用FreeBSD,但如果rm-rf
等同于rm-rf,我会非常惊讶。
@jbg是的,现在对我来说也很奇怪-这应该不是什么大问题。我可能已经调整了这个脚本的旧版本,以便相对于当前目录计算临时目录的路径,从而导致当前目录删除的消失。为了更好,您可以避免空目录,或者至少使用解决方案将问题包含在目录中,您可以这样做:1TMPWORKDIR=$(basename'mktemp-d-p/tmp/git/)
然后是2rmdir/tmp/git/“${TMPWORKDIR}”
。如果变量现在为空,您仍将返回到/tmp/git/
而不是整个系统。在回答中考虑这样的问题,我会欣然同意。虽然这是一个有趣的错误处理解决方案,但再多解释一下优点和可能的缺点就好了。1.-d
检查目录。2.)终止已经是这些信号的默认值。