为什么`mv file / dir`不能将文件移动到当前工作目录的子目录中?


10

我在/etc目录中并输入了命令

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

我认为这会将文件移到该目录openvpn的子目录中/etc。但是,这似乎不是发生的事情。我能确认的就是命令已执行。

Answers:


51

如果不存在具有该名称的目录,则将文件重命名为openvpn位于根目录中/。要还原此内容,请运行:

sudo mv /openvpn /etc/MyFile.conf

如果目录确实存在,则将文件移入其中,则还原为:

sudo mv /openvpn/MyFile.conf /etc/

要将其移动到当前目录的现有子目录中,可以运行以下任意一个–那些使用相对路径:

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.是指向当前目录的链接,因此./在路径的开头表示“在此目录中”。末尾的斜杠表示该openvpn目录是您要在其中移动文件的目录。如果您不提供该文件,那么如果存在具有该名称的目录,则文件将被移入其中,否则文件将被重命名openvpn/末尾带有a ,mv将在目录丢失且未重命名时警告您,因此,如果您不想重命名,这就是安全的方法。

/另一方面,如果您的路径以绝对路径开头,则无论当前工作目录是什么,它始终是相对于根目录的/。对文件和目标使用绝对路径,您的命令将如下所示:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

进一步阅读


2
如果您不知道该目录是否存在,请sudo mv /openvpn/MyFile.conf /etc/首先尝试使用该命令。在可能的情况下,该目录不存在,它只会给您一个错误(可能是“ Not a directory”),并且不会触摸文件系统。然后,您可以这样做sudo mv /openvpn /etc/MyFile.conf
flarn2006 '19

9

您需要使用

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

MyFile.conf文件移到的openvpn子目录中/etc/

另一方面

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

会将文件移动为/目录openvpn(即重命名为openvpn)(假设/openvpn目录不存在)。


3
同样,第一个命令末尾的斜杠是可选的。但是我想这是一个好习惯,因为如果它不是目录,它将使命令失败,而不是造成OP所描述的混乱情况(或更糟的是,覆盖重要文件。)
flarn2006

4

移动文件时,您告诉OS您要放置文件的目录或要提供的新路径。

您告诉操作系统“ / openvpn”。因此,它将完全执行该操作-检查/ openvpn是否存在(表示位于根目录中的名为“ openvpn”的对象) 并且是目录,如果是,则将文件移入其中,或者/ openvpn是文件还是不存在,请重命名并移动您的文件,以便现在可以将其作为/ openvpn访问。

您要执行的操作是将其移动到当前目录中的“ openvpn”目录中,而不是文件系统根目录(即前导“ /”所代表的目录)中。因此,您必须在move命令中指向目录,而不是绝对路径“ / openvpn”。这些中的任何一个都可以工作:

  • mv MyFile.conf openvpn -在我当前的目录中查找此“ openvpn”
  • mv MyFile.conf /etc/openvpn -寻找绝对路径/ etc / openvpn
  • mv MyFile.conf openvpn/ -在我当前的目录中查找名为openvpn的目录
  • mv MyFile.conf ./openvpn -使“当前目录”更加明显

简短版本-您可能使用“ /”来表示“我的当前目录”,因此使用“ / openvpn”来表示“当前目录中的openvpn”。但是前导“ /”仅表示“根目录”,因此“ / openvpn”表示“根目录中的openvpn”。您只需要简单地使用“ openvpn”或“ openvpn /”,即“我当前目录中的 openvpn ”。


1
不知道为什么这个答案被否决了;是正确的,我实际上认为这是最清晰的!
Lightness Races in Orbit,

1

任何以开头的路径/都是绝对路径,而不是相对路径。

如果所有路径始终都是相对于当前目录的,那么您cd /etc首先会如何?您必须cd ../../../../../etc并且希望这是足够的级别..,或者只是继续做cd ..直到到达根目录。

否则,您需要其他语法来表达绝对路径。但是Unix决定使用/绝对的含义,其他与该进程当前工作目录有关的其他内容。所以mv MyFile.txt openvpn会工作。


不,从现有文件或不存在文件中推断绝对值还是相对值并不可行。我们不希望mkdir系统调用将路径与系统调用区别对待,chdir或者renamemv程序执行此操作只会为mv与其他需要输出文件名的程序之间的不一致留出余地。

mv之所以很特别,是因为当rename()目标是目录时,它将源文件名附加到该目标目录中,然后重试。但是请注意,一个简单的实现策略依赖于第一个rename()系统调用失败,EEXIST或失败EISDIR。因此,在检查文件系统之前,我们必须知道路径是相对的还是绝对的。

(早期的Unix在运行速度较慢的计算机上运行,​​在该计算机上进行额外的检查是否存在目录可能意味着如果未缓存该目录,则可能会导致额外的I / O,否则会对目录缓存产生更大的压力。但是我认为,理智/正确性参数足以解释为什么您第一次猜测如果不诉诸历史效率论证,这并不是该系统正常工作的方式。)


1

要完成其他答案:

mv file.txt /location

与Windows相同

mv file.txt c:\location

linux中的文件系统被认为符合文件系统层次结构标准,简称FHS。它可以帮助您根据文件的性质和内容知道应将文件放置在何处。

第一个文件夹(c:在Windows中等于)/

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.