Shell 脚本 - 如果目录不存在则创建目录

Posted

技术标签:

【中文标题】Shell 脚本 - 如果目录不存在则创建目录【英文标题】:Shell Script - Make directory if it doesn't exist 【发布时间】:2014-05-19 14:54:02 【问题描述】:

我想输入一个目录的名称并检查它是否存在。 如果它不存在我想创建但我收到错误mkdir: cannot create directory'./' File exists

我的代码说该文件存在,即使它不存在。我做错了什么?

echo "Enter directory name"
read dirname

if [[ ! -d "$dirname" ]]
then
    if [ -L $dirname]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
    else
        echo "File exists"
    fi
fi

【问题讨论】:

为什么是mkdir ./$dirname 而不仅仅是mkdir "$dirname" 当我忽略 ./ 时,它说无法创建 - 没有这样的文件或目录 尝试引用,也许你有一些空格,它试图做mkdir ./ your_dir而不是mkdir ./your_dir。所以你应该单独使用mkdir "$dirname" 【参考方案1】:

试试这个代码:

echo "Enter directory name"
read dirname

if [ ! -d "$dirname" ]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
else
    echo "File exists"
fi

输出日志:

Chitta:~/cpp/shell$ ls
dir.sh

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New1
File doesn't exist. Creating now
File created

chitta:~/cpp/shell$ ls
New1  dir.sh

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New1
File exists

Chitta:~/cpp/shell$ sh dir.sh
Enter directory name
New2
File doesn't exist. Creating now
File created

Chitta:~/cpp/shell$ ls
New1  New2  dir.sh

【讨论】:

【参考方案2】:

试试这个:ls yourdir 2>/dev/null||mkdir yourdir,它小巧简洁,可以完成您的任务。

【讨论】:

请添加更多详细信息,为什么这种方法更好。目前这可能是一条评论。 这里的想法是检查您是否能够ls 目录。如果目录不存在,ls 命令将返回非零退出代码,因此将调用|| 子句右侧的命令。如果目录已经存在,ls 命令将返回 0 - true - 并且仅评估 || 的左侧【参考方案3】:
if [ -L $dirname]

查看这一行产生的错误消息:“[: missing `]'”或类似的(取决于您使用的shell)。您需要在括号内留一个空格。除非您使用双括号,否则您还需要在变量扩展周围加上双引号;你可以learn the rules,或者使用一个简单的规则:始终在变量替换和命令替换周围使用双引号"$foo""$(foo)"

if [ -L "$dirname" ]

然后有一个逻辑错误:只有当存在不指向目录的符号链接时,您才创建目录。你大概是想在里面有一个否定。

不要忘记该目录可能是在您的脚本运行时创建的,因此您的检查可能会显示该目录不存在,但当您尝试创建该目录时该目录会存在。 Never do “check then do”, always do “do and catch failure”.

如果目录不存在,创建目录的正确方法是

mkdir -p -- "$dirname"

(如果$dirname 包含空格或通配符,则双引号,如果以- 开头,则--。)

【讨论】:

【参考方案4】:
read -p "Enter Directory Name: " dirname
if [[ ! -d "$dirname" ]]
then
        if [[ ! -L $dirname ]]
        then
                echo "Directory doesn't exist. Creating now"
                mkdir $dirname
                echo "Directory created"
        else
                echo "Directory exists"
        fi
fi

【讨论】:

以上是关于Shell 脚本 - 如果目录不存在则创建目录的主要内容,如果未能解决你的问题,请参考以下文章

Shell 脚本检查 dir 目录是不是存在然后更改路径,如果不存在则使用该名称创建 dir 并检查文件名不存在

shell脚本练习1创建目录和文件

shell 测试URL 是否正常脚本

shell脚本判断里面的字符含义

shell判断文件是不是存在

shell脚本之if条件测试语句