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

评论 0 浏览 0 2019-09-02

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

在第一条命令的情况下,readlinkfoo/的相对路径解析为/home/example/foo/的绝对路径。

在第二种情况下,readlinklink/的符号链接解析为相同的绝对路径。

对于最后两条命令,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.文件的绝对目录

要获得一个文件的绝对目录,我们要结合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一起使用,但不一定与其他外壳一起使用。

4.总结

在本教程中,我们看了readlinkdirname命令,以及如何用它们分别获得相对路径的绝对路径和包含路径的目录。

通过组合这些命令--通过xargs或命令替换--我们可以获得一个文件的绝对目录。

最后更新2022-11-23
0 个评论
标签