问题
在 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行