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

server/2024/9/24 17:17:37/

问题

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


回答

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

bash">if [ -d "$DIRECTORY" ]; thenecho "$DIRECTORY does exist."
fi

一行代码的形式则如下:

bash">[ -d "$DIRECTORY" ] && echo "$DIRECTORY does exist."

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

bash">if [ ! -d "$DIRECTORY" ]; thenecho "$DIRECTORY does not exist."
fi

一行代码的形式则如下:

bash">[ ! -d "$DIRECTORY" ] && echo "$DIRECTORY does not exist."

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

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

将产生错误消息:

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

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

bash">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

相关阅读:

  • 2>&1是什么意思
  • 如何用命令行将文本每两行合并为一行?
  • 在Bash中如何提取子字符串
  • 为什么要使用xargs命令
  • 在shell编程中 $(cmd) 和 `cmd` 之间有什么区别
  • 在shell程序里如何从文件中获取第n行

http://www.ppmy.cn/server/100230.html

相关文章

Qt for MCUs: 为嵌入式微控制器(MCU)设计和开发高性能应用程序

Qt for MCUs是一个完整的图形框架和工具包 软件平台 Linux、macOS、Windows 支持的开发语言 C、QML、Python、JavaScript等 开发商 The Qt Company 最近更新时间 2024年3月13日 最新版本 2.7 简介 Qt for MCUs提供了一个轻量级图形框架和工具包,使您能够…

针对thinkphp站点的漏洞挖掘和经验分享

0x1 前言 浅谈 目前在学习和研究thinkphp相关漏洞的打法,然后最近对于thinkphp资产的收集方面有了一个简单的认识,然后写一篇新手看的thinkphp相关的漏洞收集和挖掘的文章来分享下。然后后面是给师傅们分享下后台文件上传,然后直接打一个ge…

高级网络渗透测试技术(第一篇)

一、概述 网络渗透测试(Penetration Testing, Pen Test)是通过模拟恶意攻击者的行为来评估计算机系统、网络或Web应用的安全性。高级网络渗透测试技术则涵盖了更复杂和深入的测试方法,能够更有效地发现并利用系统中的潜在漏洞。 二、前期准…

ApiPost7 和 PostMan 区别

ApiPost7 和 PostMan 都是常用的 API 测试工具。 1. 用户界面和操作体验 ApiPost7 的界面设计可能更简洁直观,对新手更友好。 PostMan 则功能布局相对更复杂,但提供了更多的定制选项。 2. 协作和团队支持 PostMan 在团队协作和共享方面可能具有更强…

BUUCTF lovesql 1

我们使用万能密码登录进去 会获取到用户名和密码 Hello admin! Your password is 0ed76caed1e7afe0bb1eaa590fa465ef 我们使用一下order by,发现2,3没问题,当我们输入4列的时候,4列是不存在的 也就是说一共3列&…

二自由度机械臂软件系统(三)ros2_control硬件底层插件

ros2_control实现了两个功能,一个是控制算法插件即控制的实现,另一个是底层插件即跟硬件通信的功能。 参考资料:https://zhuanlan.zhihu.com/p/682574842 1、创建功能包 ros2 pkg create --build-type ament_cmake robot_control_test在sr…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

基于SpringBoot+VUE的员工绩效考核管理系统(源码+文档+部署)

主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等 业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写…