我面临一个非常奇怪的问题。考虑一个例子,我有这些目录"/ten"one_answers"/1/2/3/4"我在这些目录中有一些文件。当我执行以下命令时
mv /ten/ /one/two/three/four/five/six
它将输出作为mv:无法将"/ten/"移动到"/1/2/3/4/5/6":没有这样的文件或目录。这看起来很好,因为它不创建目录。
但是如果我执行以下命令
mv /one/two/three/four/ /one/two/five/six
目录5/6在/one/2中创建。即mv命令成功。
有人能解释一下这里发生了什么吗?为什么它不给出一个错误没有这样的文件或目录?
编辑:进一步观察。。
目录/一/二/三/四也存在目录/一、二/五。执行mv /one/two/three/four/ /one/two/five/six
将成功。在这里,目录六将被创建,即使它不存在
当我执行mv /one/two/three/four /one/two/five/six
并且"five"目录不存在时,这种情况不会发生。在这种情况下,它会出错。
我以为mv永远不会创建任何目录。
如果我遗漏了一些明显的内容,请告诉我。
要么正在执行另一个mv
二进制文件,要么正在执行mv
的另一个版本,要么正在将其封装为函数、脚本或别名。
要知道你是否真的在运行真正的mv
,请运行
type mv
你应该得到
mv is /bin/mv
根据Etan Reisner的建议,您也可以添加-a
以获得更多信息:
type -a mv
更新
目录/1/2/3/4也存在目录/1/2/55存在。执行mv/1/2/3/4//one/2/5/6将达到目的在这里,目录六将被创建,即使它不是目前在我执行mv的情况下不会发生这种情况/一个/两个/三个/四个/一个/二个/五个/六,而"五"目录没有存在。在这种情况下,它会出错。
由于/one/two/five
的存在,它只是将目录/one/two/three/four
移动为/one/two/five/six
。这意味着/one/two/five/six
现在是以前为/one/two/three/four
的目录的新名称或路径名。
通过参考mv
的man page
和几个例子,可以帮助您理解所遇到的问题。从man 1 mv
将SOURCE重命名为DEST,或将SOURCEs移动到DIRECTORY不明显的是SOURCE
和DEST
,这就是你的困惑所在。例如:
mv /ten/ /one/two/three/four/five/six
it gives the output as mv: cannot move '/ten/' to '/one/two/three/four/five/six' :
No such file or directory. Which looks fine as it doesn't create directories.
事实并非如此。在您的示例中,SOURCE
是/ten
,您的DEST
取决于/one/two/three/four/five
是否存在以及/one/two/three/four/five/six
是否存在。
如果/one/two/three/four/five
存在,则mv /ten /one/two/three/four/five
将导致/ten
被移动并成为/one/two/three/four/five
的新子目录。例如CCD_ 26。
如果/one/two/three/four/five
存在(但不存在../six(,则mv /ten /one/two/three/four/five/six
将导致/ten
移动,并成为/one/two/three/four/five
的six
新子目录。例如CCD_ 32。
但是,如果/one/two/three/four/five
不存在,则mv
将失败,因为您没有提供有效的DEST
。