如何确定mv移入目录而不是替换目录?


18

说我有一个目录/hello

那我做mv /hello /hello2

我要/hello进去/hello2/hello吗?还是我移动/hello/hello2

看来当我做这样的事情时,我会得到不一致的结果。


1
在什么情况下结果不一致?似乎只要目标目录存在,它就会移入目标目录,否则它将被重命名。
jmathew

那是不一致的。相同的命令应该执行相同的操作。这意味着命令不明确。
user4951 2013年

这并不是真的前后矛盾,因为它在上下文中始终如一地起作用。虽然我可以看到它的混乱之处,但我想得更多,但为了使它适用于所有情况,该命令必须采用这种方式。
jmathew

我宁愿说这是它的设计方式,也是mv合乎逻辑的.. 如果与文件一起使用,它会做同样的事情。只是重命名。但mv与目录一起使用由于没有一个mv命令而不是删除带有子目录的整个目录是不好的安全。因此它被移动为test1/test2。但是,如果仍要实现它alias,请编写一个命令,检查给定的参数是否为目录,然后对目录执行rm -rf并使用该mv命令,但使用此命令的风险由您自己承担。
harish.venkat

我怀疑您的示例是基于对“过去的事情”的错误记忆,是基于“似乎我在做这样的事情”。如果/hello/hello2都是目录,那么我注意到这cp /hello /hello2是不一致的。根据什么尾随斜线的组合都在那里,有时内容/hello复制到/hello2,有时候目录本身被复制。
Izkata

Answers:


16

mv a b尝试a进入bif b是目录还是目录的符号链接。否则,它将重命名(或在不同文件系统上复制和删除)ab

为了获得一致的结果将文件移动到目录中,可以执行以下操作:

mv file dir/

要么

mv file dir/.

如果dir不存在,则会出现错误,并且不会重命名filedir

另一方面,如果您要执行操作rename而不必担心目标文件是否作为目录存在,则可以使用GNU mv:

mv -T file dest

在这种情况下,如果是目录,file则不会移入。但是,如果和都是目录,并且为空,则将重命名为(并将原始名称删除)。如果两者都是目录并且非空,则会抱怨。destdestfiledestdestfiledestdestdestmv -T

同样的,如果filedest不是目录(这包括符号链接包括链接到目录),file将被重命名为dest(虽然你会得到一个提示,如果你没有写权限dest),和原来的dest将被删除。有一个区别mv file dest在哪里的情况下dest是一个符号链接到一个目录。有-Tfile被重命名为dest,但没有-Tfile被移动到所指向的目录中dest

综上所述,在之后mv -T file dest,要么file被重命名为,要么将dest收到错误消息(或提示)。如果命令成功执行,则原来的dest(如果已存在)将被删除。


14

这完全取决于是否已经存在一个名为“ / hello2”的目录。

如果/ hello2存在并且是目录,那么move将始终将/ hello移动到/ hello / hello2

如果/ hello2不存在,那么move将始终将/ hello重命名为/ hello2

如果/ hello2存在并且是文件,您将得到一个错误,“无法用目录'hello'覆盖非目录'hello2'。


3

我尝试了这些

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

希望这能解释一切。-v是详细模式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.