我想将“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
就会表现出来,并且会表现出来。 ~/shortcut
ls
file.txt
pwd
~/shortcut
然而pwd
,虽然根据您到达那里所遵循的符号链接,的输出是正确的,但您实际上(“物理上”,如果您愿意的话)位于~/maindir/subdir
. ls
并mv
意识到这一点,因此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
先前包含的内容将被删除。