检查外壳脚本中是否存在目录

什么命令可用于检查 Shell 脚本中是否存在目录?

答案

要检查 shell 脚本中是否存在目录,可以使用以下命令:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

或检查目录是否不存在:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

但是,正如乔恩 · 埃里克森Jon Ericson)所指出的,如果您不考虑到目录的符号链接也将通过此检查,则后续命令可能无法按预期运行。例如运行此:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

会产生错误信息:

rmdir: failed to remove `symlink': Not a directory

因此,如果后续命令需要目录,则可能必须区别对待符号链接:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

请特别注意用于包装变量的双引号,其原因由 8jean 在另一个答案中解释。

如果变量包含空格或其他异常字符,则可能会导致脚本失败。

在 bash 脚本中引用变量时,切记始终将变量用双引号引起来。这些天,孩子们长大了,他们的目录名称中可以有空格和许多其他有趣的字符。 (空格!回到我的时代,我们没有多余的空格!;))

有一天,其中一个孩子会在$DIRECTORY设置为"My M0viez"运行您的脚本,并且脚本会"My M0viez" 。你不要那样所以用这个。

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

注意-d测试可以产生一些令人惊讶的结果:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

文件位于:“目录何时不是目录?” 答案:“当它是目录的符号链接时。” 稍微更彻底的测试:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

您可以在 Bash 手册中找到有关Bash 条件表达式[内置命令[[复合 命令

我发现test双括号版本使编写逻辑测试更加自然:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

缩写形式:

[ -d "$DIR" ] && echo "Yes"

要检查目录是否存在,可以使用简单的 if 结构,如下所示:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

你也可以在负面做

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

注意 :请小心,在打开和关闭支架的两侧都留有空白。

使用相同的语法,您可以使用:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero
  1. 一个简单的脚本来测试目录或文件是否存在:

    if [ -d /home/ram/dir ]   # for file "if [-f /home/rama/file]" 
    then 
        echo "dir present"
    else
        echo "dir not present"
    fi
  2. 一个检查目录是否存在的简单脚本:

    mkdir tempdir   # if you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi

    上面的脚本将检查目录是否存在

    $?如果最后一个命令成功,则返回 “0”,否则返回非零值。假设tempdir已经存在,则mkdir tempdir将给出如下错误:

    mkdir:无法创建目录 “tempdir”:文件存在

if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

您可以使用test -d (请参阅man test )。

-d file如果文件存在且为目录,则为 true。

例如:

test -d "/etc" && echo Exists || echo Does not exist

注意: test命令与条件表达式[ (请参阅: man [ ),因此它可以在 shell 脚本之间移植。

[ - 这是一个代名词test内置,但最后一个参数必须,是文字] ,以配合开幕[

有关可能的选择或更多帮助,请检查:

  • help [
  • help test
  • man testman [

或完全没有用的东西:

[ -d . ] || echo "No"