我需要将 复制/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
,在这种情况下,只需删除公共前缀并应用上面的解决方案即可。