在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 )之外的所有组件都必须存在。如果路径不存在,则不返回任何输出。例如,执行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,但不一定适用于其他 shell。