在Linux中获取一个文件的绝对目录
1.绪论
在本教程中,我们将看到如何使用两个常见的Linux文件系统工具来获得一个给定文件的绝对目录。
2.前提条件
不幸的是,目前还没有一个单一的命令来获取文件的绝对目录。相反,我们必须把这个操作分成两部分,用一个命令的输出作为另一个命令的输入。
2.1. readlink
为了获得一个文件的完整路径,我们使用readlink命令。readlink打印符号链接的绝对路径,但作为一个副作用,它也打印相对路径的绝对路径。
例如,假设我们有以下的目录结构。
/
└── home/
└── example/
├── foo/
| └── file.txt
└── link -> foo/
我们使用-f标志来规范化相对路径或符号链接的路径。因此,如果我们改变目录为/home/example/,我们可以执行以下任何一个命令。
readlink -f foo/file.txt
readlink -f link/file.txt
readlink -f ./foo/file.txt
readlink -f ../example/foo/file.txt
这些命令将输出。
/home/example/foo/file.txt
在第一条命令的情况下,readlink将foo/的相对路径解析为/home/example/foo/的绝对路径。
在第二种情况下,readlink将link/的符号链接解析为相同的绝对路径。
对于最后两条命令,readlink将相对路径规范化,并解析为与前面的例子相同的绝对路径。
请注意,-f标志要求,除了提供的路径中的最后一个组件file.txt(在我们的示例中为 file.txt)必须存在。如果路径不存在,则不返回输出。例如,执行readlink -f bar/file.txt将不产生任何输出,因为bar/目录不存在。相反,执行readlink -f foo/other.txt将返回/home/example/foo/other.txt,因为除了最后的组件外,其他的都存在。
相反,如果我们不关心所提供的路径中的任何组件是否存在,我们可以使用-m标志。同样地,如果我们希望所提供的路径中的所有组件都存在,我们可以使用-e标志。
2.2. dirname
第二个先决条件是dirname命令,它可以打印出包含所提供的路径的目录。
如果我们提供一个目录,dirname输出包含该目录的路径。例如,我们可以执行。
dirname /home/example/foo/
这将会产生:
/home/example
注意,dirname打印的是绝对目录,因为我们提供了一个绝对路径。如果我们把目录改为/home/并执行dirname example/foo/,dirname将输出example。一般来说,如果提供的是相对路径,dirname将输出一个相对目录,如果提供的是绝对路径,dirname将输出一个绝对目录。
当提供一个文件时,dirname输出包含该文件的路径。例如,我们可以执行。
dirname foo/file.txt
这将会产生:
foo
3.文件的绝对目录
要获得一个文件的绝对目录,我们要结合readlink和dirname命令。我们可以通过以下两种方式之一来实现这一目的。
3.1. xargs
首先,我们可以使用xargs命令,它将输入转化为所提供的命令的参数。通过将readlink的输出输入到xargs,并将dirname的命令作为参数提供给xargs,我们就可以得到这个想要的绝对目录。
readlink -f foo/file.txt | xargs dirname
这就造成了:
/home/example/foo
3.2.命令替换
同样,我们可以使用命令替换--$(command)--在子shell中执行一个命令,该命令的输出将取代其调用。因此,我们可以执行以下内容。
dirname $(readlink -f foo/file.txt)
这条命令的结果是:。
/home/example/foo
等价地,我们也可以执行下面的命令,其输出结果也是一样的。
dirname `readlink -f foo/file.txt`
请注意,命令替换可与Bash一起使用,但不一定与其他外壳一起使用。
4.总结
在本教程中,我们看了readlink和dirname命令,以及如何用它们分别获得相对路径的绝对路径和包含路径的目录。
通过组合这些命令--通过xargs或命令替换--我们可以获得一个文件的绝对目录。