只有mkdir,如果它不存在

Mor*_*ive 93 unix bash

在我的bash脚本中,我做:

mkdir product;
Run Code Online (Sandbox Code Playgroud)

当我不止一次运行脚本时,我得到:

mkdir: product: File exists
Run Code Online (Sandbox Code Playgroud)

在控制台中.

所以我期待只有在目录不存在时才运行mkdir.这可能吗?

kon*_*box 188

做一个测试

[[ -d dir ]] || mkdir dir
Run Code Online (Sandbox Code Playgroud)

或者使用-p选项:

mkdir -p dir
Run Code Online (Sandbox Code Playgroud)

  • @user1129682:第一个选项也有潜在的竞争条件;该目录可以由 `-d` 测试和 `mkdir` 之间的某个其他进程创建。我怀疑 `mkdir -p` 会使这个竞争条件的这个时间窗口稍微短一些。 (3认同)
  • 我无法动态找到源代码,但对于Makefiles`不建议使用mkdir -p` b/c并发执行中可能存在竞争条件.因此,根据您的脚本执行的操作以及它所处的环境,第一个选项是应该首选此答案.另外,你可以只是`mkdir product 2>/dev/null`而不在乎. (2认同)

sr0*_*853 74

if [ ! -d directory ]; then
  mkdir directory
fi
Run Code Online (Sandbox Code Playgroud)

要么

mkdir -p directory
Run Code Online (Sandbox Code Playgroud)

-p如果directory不存在则确保创建

  • 单线需要额外的`;`:`如果[!-d目录]; 然后是mkdir目录; fi` (2认同)

And*_*ter 8

使用mkdir的-p选项,但请注意它也有另一种效果.

 -p      Create intermediate directories as required.  If this option is not specified, the full path prefix of each oper-
         and must already exist.  On the other hand, with this option specified, no error will be reported if a directory
         given as an operand already exists.  Intermediate directories are created with permission bits of rwxrwxrwx
         (0777) as modified by the current umask, plus write and search permission for the owner.
Run Code Online (Sandbox Code Playgroud)


Pau*_*bel 5

mkdir -p

-p, --parents 如果存在没有错误,根据需要创建父目录


Rah*_*thi 5

尝试使用这个:-

mkdir -p dir;
Run Code Online (Sandbox Code Playgroud)

注意:-这还将创建任何不存在的中间目录;例如,

查看mkdir -p

或者试试这个:-

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$Message" 1>&2
fi
Run Code Online (Sandbox Code Playgroud)