前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Bash shell脚本中如何检查一个目录是否存在

在Bash shell脚本中如何检查一个目录是否存在

作者头像
程序熵
发布2024-01-11 14:06:52
2480
发布2024-01-11 14:06:52
举报
文章被收录于专栏:技术汇

问:

在 Bash shell 脚本中什么命令检查某个目录是否存在?

答:

要检查目录是否存在,请执行以下操作:

代码语言:javascript
复制
if [ -d "$DIRECTORY" ]; then
  echo "$DIRECTORY does exist."
fi

一行代码的形式则如下:

代码语言:javascript
复制
[ -d "$DIRECTORY" ] && echo "$DIRECTORY does exist."

要检查目录是否不存在,请执行以下操作:

代码语言:javascript
复制
if [ ! -d "$DIRECTORY" ]; then
  echo "$DIRECTORY does not exist."
fi

一行代码的形式则如下:

代码语言:javascript
复制
[ ! -d "$DIRECTORY" ] && echo "$DIRECTORY does exist."

如果不考虑符号链接到目录的情况,后续命令可能无法按预期工作,因为符号链接也会通过这个检查。例如,运行以下代码:

代码语言:javascript
复制
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

将产生错误消息:

代码语言:javascript
复制
rmdir: failed to remove `symlink': Not a directory

因此,如果后续命令期望处理的是目录,则可能需要对符号链接进行特殊处理:

代码语言:javascript
复制
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

众所周知,Unix 的设计哲学之一是 "Everything is a file"。在 Unix 的早期设计中,许多系统资源都被抽象为文件,以实现统一和一致的接口处理,这样程序员可以使用相同的系统调用来操作不同的资源,如普通文件、目录、设备等。这种哲学影响了许多 Unix-like 的操作系统,包括 Linux。

这里顺便整理一下 Bash 中对文件的各种测试:

-a file -- 如果文件存在则为真。 -b file -- 如果文件存在且为块特殊文件则为真。 -c file -- 如果文件存在且为字符特殊文件则为真。 -d file -- 如果文件存在且为目录则为真。 -e file -- 如果文件存在则为真。 -f file -- 如果文件存在且为普通文件则为真。 -g file -- 如果文件存在且其设置了组ID位(set-group-id)则为真。 -h file -- 如果文件存在且为符号链接则为真。 -k file -- 如果文件存在且设置了"粘滞"位(sticky bit)则为真。 -p file -- 如果文件存在且为命名管道(FIFO)则为真。 -r file -- 如果文件存在且可读则为真。 -s file -- 如果文件存在且大小大于零则为真。 -u file -- 如果文件存在且设置了用户ID位(set-user-id)则为真。 -w file -- 如果文件存在且可写则为真。 -x file -- 如果文件存在且可执行则为真。 -G file -- 如果文件存在且属于有效组ID所有则为真。 -L file -- 如果文件存在且为符号链接则为真。 -N file -- 如果文件存在且自上次读取后已被修改则为真。 -O file -- 如果文件存在且属于有效用户ID所有则为真。 -S file -- 如果文件存在且为套接字(socket)则为真。


参考文档:

  • stackoverflow question 59838
  • https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档