Unix 文件名和路径

Unix 文件名和路径
  1. 如何获取任何目录的完整文件名?
  2. 文件路径是否也应该没有任何根目录?

答案1

POSIXly,要获取目录的无符号链接绝对路径,其中存储的路径(可能相对于当前目录,可能带有符号链接)存储在 中$dir,前提是您有搜索对该目录的权限,你可以这样做

(
  case $dir in
    (/*) CDPATH= cd -P "$dir";;
    ("") CDPATH= cd -P "";;
    (*) CDPATH= cd -P "./$dir";;
  esac && pwd -P
)

这里逐字复制自该文本将包含在 POSIX 规范的下一版本中

如此处所述,对于这种""情况,您可能希望输出错误,而不是依赖当前未指定的行为cd或编写它:

(
  case "${dir:?directory cannot be empty}" in
    (/*) CDPATH= cd -P "$dir";;
    (*) CDPATH= cd -P "./$dir";;
  esac && pwd -P
)

请注意,当不是绝对时,前缀$dirwith./并不是为了$dir在它开头时不被视为一个选项-(这就CDPATH= cd -P -- "${dir:?cannot be empty}"足够了),而是为了特殊值-,而不是cd解释为表示$OLDPWD上一个工作目录(并且CDPATH= OLDPWD=- cd -P -- "${dir:?cannot be empty}"不能便携式地用来解决这个问题)。

一种情况是目录当它是当前目录并且已与其父目录取消链接时,不能有绝对路径:

$ mkdir 1
$ cd 1
$ rmdir ../1
$ cd -P .
$ ls -ld .
drwxr-xr-x 0 chazelas chazelas 0 Mar 27 06:53 ./
$ [ -d . ] && echo yes
yes

仍然存在,但是:

$ pwd -P
.
$ realpath .
realpath: .: No such file or directory
$ readlink -ve .
readlink: .: No such file or directory

它在文件系统上没有路径。

没有这样的文件或目录error 有点误导,因为.目录确实存在(尽管人们不能用它做太多事情),但至少在 Linux 上,getcwd()返回一个ENOENTerrno 表示当前目录已取消链接。

答案2

相对路径不包含根目录,因为它们是相对于当前目录的。

例子:

development/project/src

src这是当前目录下称为两级目录的相对路径。路径没有说明它src是目录名、文件名还是其他名称。

在 Linux 系统上,您可以使用该realpath实用程序来获取名称的完整(绝对)路径:

$ realpath development/project/src
/home/myuser/work/development/project/src

绝对路径始终以根目录开头。更准确地说,它从当前进程的根目录开始,可以使用命令更改该根目录chroot

在大多数 Unix 系统上,您可以在从当前目录开始的相对路径前加上前缀来$PWD获取绝对路径:

$ printf '%s\n' "$PWD/development/project/src"
/home/myuser/work/development/project/src

然而,这只是一个字符串连接,并不能以与解析路径完全相同的方式解析路径realpath。如果给定的相对路径正确,它将给出一个功能性的绝对路径。

相关内容