Contents

在Linux中获取文件的绝对目录

1. 简介

在本教程中,我们将了解如何使用两种常见的 Linux 文件系统工具获取给定文件的绝对目录。

2. 先决条件

不幸的是,目前没有一个命令可以获取文件的绝对目录。相反,我们必须将操作分成两部分,使用一个命令的输出作为另一个命令的输入。

要获取文件的完整路径,我们使用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. 文件的绝对目录

要获取文件的绝对目录,我们结合使用readlinkdirname命令。我们可以通过以下两种方式之一来做到这一点。

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。