在 Unix 中,如何使用相对路径将 /etc/passwd 复制到我的主目录下的目录?

在 Unix 中,如何使用相对路径将 /etc/passwd 复制到我的主目录下的目录?

我需要将 复制/etc/passwd到我已经创建的目录,并使用新名称my_passwd。我了解如何使用绝对路径复制它:cp /etc/passwd /home/user/work/my_passwd

所以我知道这.就是我在 shell 中的位置,..用于将我在我所在的目录中向上移动一个,然后我输入cd work,如果我在家,我可以移动到那里?我错了吗?我将如何使用相对路径进行复制?

答案1

相对路径是不以 开头的路径/

在此特定示例中,/etc/passwd是绝对路径,如果您知道要复制的文件的绝对路径将其转换为相对路径(通常)没有实际目的(事实上​​,这可能会让事情变得混乱,因为路径取决于您当前所在的目录树中的位置)。

您要将文件复制到的目录的$HOME/work文件名是my_passwd$HOME将扩展到您的主目录的绝对路径。

仅使用绝对路径复制文件:

cp /etc/passwd "$HOME/work/my_passwd"

这并不取决于您当前所在的文件系统中的位置(这很好)。

要查找文件的相对路径/etc/passwd,您可以realpath在 Linux 上使用该命令(此实用程序在其他类型的 Unix 系统上可能不可用,但至少在 Ubuntu 中可用)。假设您位于主目录中(在给出cd不带参数的命令之后):

$ realpath --relative-to=. /etc/passwd
../../etc/passwd   

这告诉我们“/etc/passwd位于从这里向上两个目录,然后位于etc”中。

要使用相对路径复制位于主目录中的文件(它无法从目录树中的其他位置复制):

$ cp ../../etc/passwd work/my_passwd

work/my_passwd是从主目录到子目录my_passwd中文件的相对路径work

醚的组合

$ cp /etc/passwd work/my_passwd

或者

$ cp ../../etc/passwd "$HOME/work/my_passwd"

显然也可以工作(从您的主目录),具体取决于您想要绝对或相对指定的路径。

答案2

如何建立相对路径/etc/passwd?创建 的相对路径/,然后添加etc/passwd。如何建立相对路径/?计算当前目录的深度,然后向根目录前进那么多步。

因此,如果我们在 中/home/user/work,我们将使用 向根方向移动 3 次../../../。以编程方式,计算当前路径中的斜杠,或者仅将所有目录名称替换为..,并将第一个斜杠移至末尾。

让我们在 Bash 中执行后者:

shopt -s extglob
p=${PWD//+([^\/])/..}
p=${p#/}/
echo "current is: $PWD"
echo "path to /:  $p"

输出例如:

current is: /tmp/x
path to /:  ../../

也许更实际的情况是我们需要从/foo/bar/some/path到 的相对路径/foo/bar/otherpath,在这种情况下,只需删除公共前缀并应用上面的解决方案即可。

相关内容