当我输入“mv file.txt ../”时,文件发生了什么?

当我输入“mv file.txt ../”时,文件发生了什么?

我想将“file.txt”文件夹向上移动一个文件夹,但mv file.txt ../file.txt我没有输入mv file.txt ../.

现在该文件消失了,我没有收到任何错误消息。所以看来某些行动已经成功完成了。但这里发生了什么?

我有备份,所以至少没问题。但我想了解我做了什么,以及我是否更改了任何内容或者该文件是否神奇地消失了。

答案1

该文件已移至实际的您所在目录的父目录,而不是您到达那里的符号链接的父目录。默认情况下,遇到 时的cd行为与ls或不同。 只是沿着路径向上,有效地反向跟随符号链接,而其他目录则转到它们所在目录的实际父目录,无论您如何到达那里。mv..cd

想象一个像这样的目录树(~是主目录并且shortcut是到的符号链接maindir/subdir):

~
├── maindir/
│   └── subdir/
│       └── file.txt
└── shortcut -> maindir/subdir/

如果你简单地那么cd就会表现出来,并且会表现出来。 ~/shortcutlsfile.txtpwd~/shortcut然而pwd,虽然根据您到达那里所遵循的符号链接,的输出是正确的,但您实际上(“物理上”,如果您愿意的话)位于~/maindir/subdir. lsmv意识到这一点,因此mv file.txt ..将移动file.txt到实际的父目录:~/maindir,而不是~像您预期的那样。

通过使用开关,您可以cd像其他人一样行事-P。因此,如果您位于最初运行命令的目录mv( ~/shortcut) 并运行cd -P ..,它将带您进入实际的父目录(例如~/maindir),您将能够file.txt通过简单的ls file.txt. (您也可以使用 访问实际的当前目录cd -P .。)

答案2

mv file.txt ..并且mv file.txt ../file.txt具有完全相同的效果。有一个微妙的区别mv

  • 如果最后一个参数是目录(此处..),则可以输入多个源,它们将被移动到具有相同名称的目标
  • 如果最后一个参数不是目录(是文件或不存在),则单身的源已移至那里。

所以,如果 dir 是一个目录:

mv file1 file2 file3 dir  # Moves the files there
mv file dir               # Moves one file
mv file dir/newname       # Moves file, new name
mv file newfile           # Just renames

答案3

mv file.txt ../是一个完全合法的命令:您告诉内核将文件名移动到当前目录的父目录。 file.txt不应该消失,它仍然应该出现在您发出命令的任何目录的父目录中。

情况可能会改变所发生的事情。例如,如果../file.txt已经存在,则其内容现在是 的内容./file.txt,并且../file.txt先前包含的内容将被删除。

相关内容