我设置了两个文件夹:
/
folder/
subfolder/
file.txt
symlink-folder/
subfolder/ -> /folder/subfolder
如果我cd /symlink-folder/subfolder
随后运行ls
,就会看到file.txt
,正如我所料。但是,如果我随后运行mv file.txt ..
,就会得到以下结果:
/
folder/
file.txt
subfolder/
symlink-folder/
subfolder/ -> /folder/subfolder
基本上,命令file.txt
移至它是父目录,而不是我期望的 shell 的父目录。如果我运行pwd
,我会看到/symlink-folder/subfolder
。如果我运行cd ..
,它会导航到/symlink-folder
。这两者都按我的预期工作。
我该如何设置?
编辑:经过一些测试,如果我导航到/symlink-folder/subfolder
然后运行vi ../file
并保存,它也会创建一个文件在原始文件夹的父级中,而不是 shell 的父级中。看来符号链接本身的行为很奇怪,而不是使用它的命令。 cd
有效,但任何其他命令似乎都不起作用。
答案1
请阅读为什么ls ..
当我位于符号链接目录中时会显示真实的父内容?我的答案就在那里。然后这个答案关于cd
和pwd
。
mv
像 your 、 yourvim
或(在链接的问题中)这样的工具ls
始终将其当前工作目录视为物理路径。如果它检查了$PWD
从 shell 调用该工具时肯定应该在环境中的环境变量,它就可以知道逻辑路径。几乎不使用任何工具$PWD
,所提到的工具没有,我们可以说不使用$PWD
是常见的行为。
因此,对于您的mv
..
意思是“身体的当前工作目录的路径”。
cd /symlink-folder/subfolder
逻辑路径为,/symlink-folder/subfolder
但物理路径为/folder/subfolder
。对于任何不使用 的工具来说$PWD
..
意味着/folder
。只有使用 的工具$PWD
才会将..
其视为/symlink-folder
。
为了mv
按您的需要工作,您需要使用$PWD
一种或另一种方法。您可以$PWD
以某种方式进行解析和/或使用使用该变量的工具。shellcd
中的内置命令pwd
(可能是内置命令或单独的可执行文件)就是这样的工具。
例如mv file.txt ..
你可以这样做:
(cd -L .. && mv subfolder/file.txt .)
(我在这里使用了子 shell,因此主 shell 的当前工作目录不会改变)。这里cd -L ..
使用了$PWD
,但你的大脑也必须解析$PWD
才能知道在 前面添加什么字符串file.txt
。这种解析可以自动化,但相当麻烦。如果这是一次性工作,那么我认为用大脑进行解析是正确的做法。
或者你也可以这样做:
mv file.txt "$(cd -L .. && pwd)"
这里cd -L ..
使用并根据逻辑路径$PWD
将子shell(执行命令替换的 insisde)放入。然后打印当时的工作目录(我认为最终它是还是并不重要)。这种方法不需要您手动(或者更确切地说是用大脑)进行解析。..
pwd
pwd -L
pwd -P
$PWD
另一种解决方案是直接$PWD
作为字符串进行操作:
mv file.txt "${PWD%/*}/"
${PWD%/*}
$PWD
扩展为不包含最后一个斜杠的内容以及其后的所有内容(删除最小后缀模式,这里)。这会转换/symlink-folder/subfolder
为/symlink-folder
。但是,如果当前工作目录是/
,则结果将是一个空字符串,这是错误的;因此我将一个后置,/
并且在的情况下,/
我将得到/
(这很好,因为/..
方法/
)。在我们的例子中,/symlink-folder/subfolder
我得到的结果是与被(由)解释为目标目录时/symlink-folder/
一样好。/symlink-folder
mv
此方法对于任何来说都应该表现良好$PWD
。应该始终包含不带或组件的$PWD
绝对路径(否则可能导致方法行为异常)。.
..
答案2
你似乎描述了一种非标准行为。手册页 符号链接(7) 说:“mv(1) 和 rm(1) 命令不遵循以参数命名的符号链接,而是分别尝试重命名和删除它们”。
您可能能够使用两个命令来解决此问题:
cp
符号链接和rm
原始命令。
如果的实现cp
遵循手册页,那么的以下参数cp
可能会有所帮助:
-d same as --no-dereference --preserve=links
-P, --no-dereference
never follow symbolic links in SOURCE