我正在编写一个可在AIX上的KornShell(ksh)下运行的shell脚本。我想使用mkdir
命令来创建目录。但是,如果该目录已经存在,则我不想执行任何操作。因此,我要么测试该目录是否不存在,要么抑制mkdir
尝试创建现有目录时引发的“文件已存在”错误。
我应该如何最好地做到这一点?
directory_name = "foo"
if [ -d $directory_name ]
then
echo "Directory already exists"
else
mkdir $directory_name
fi
这是一个简单的函数(Bash shell),可以让你在目录不存在时创建目录。
#------------------------------------------#
# Create a directory if it does not exist. #
#------------------------------------------#
# Note the "-p" option in the mkdir #
# command which creates directories #
# recursively. #
#------------------------------------------#
createDirectory() {
mkdir -p -- "$1"
}
您可以按以下方式调用上述函数:
createDirectory "$(mktemp -d dir-example.XXXXX)/fooDir/BarDir"
上述命令将创建fooDir和BarDir(如果它们不存在)。请注意,mkdir命令中的“-p”选项会递归地创建目录。
或者,如果您想先检查是否存在:
if [[ ! -e /path/to/newdir ]]; then
mkdir /path/to/newdir
fi
-e 是用于 KornShell 的存在测试。
您也可以尝试搜索 KornShell 手册。
参考man mkdir
手册中关于选项-p
的说明。
-p, --parents
no error if existing, make parent directories as needed
如果存在将创建给定路径中的所有目录,否则会从左到右创建给定路径中的所有目录。尝试下面的命令。在发出此命令之前,目录newdir
和anotherdir
不存在。
正确用法
mkdir -p /tmp/newdir/anotherdir
执行该命令后,您可以看到newdir
和anotherdir
在/tmp下创建。您可以随时多次使用此命令,该命令始终具有exit(0)
。因此,大多数人在在实际使用这些路径之前在shell脚本中使用此命令。
对经典解决方案(由Brian Campbell提供)进行改进-以处理指向目录的符号链接的情况。
[ -d foo/. ] || mkdir foo
mkdir -p sam
if [ !-d $dirName ];then
if ! mkdir $dirName; then # Shorter version. Shell will complain if you put braces here though
echo "Can't make dir: $dirName"
fi
fi