问题在于像
mv source target
这样的命令的行为,当
target
不以
/
结尾时,取决于是否存在名为
target
的现有目录(或指向目录的现有符号链接)。有时候它们的行为与你期望的不同。
你展示了四个命令。第一个命令是最重要的。
mv sample.txt Downloads
那个命令移动或重命名了
sample.txt
。
如果当前目录中根本没有叫做
sample.txt
的文件,那么
mv sample.txt Downloads
操作失败,没有任何改变。但根据你的描述,似乎确实存在这样一个文件。所以:
1. 如果当前目录中有一个叫做
Downloads
的目录,那么
mv sample.txt Downloads
尝试
将sample.txt
移动到名为Downloads
的目录中,并且可能成功了。如果
Downloads
是一个符号链接而不是一个实际的目录,也会发生这种情况。
2. 如果当前目录中没有叫做
Downloads
的目录,那么
mv sample.txt Downloads
尝试
将sample.txt
重命名为Downloads
。(不是
Downloads.txt
,只是
Downloads
。)
如果这个文件在“桌面”目录中,那么第二种情况可能发生了,因为您可能没有一个名为“下载”的目录在“桌面”目录中。但是如果您有,那么您就处于第一种情况。
所以,您应该查看运行“mv sample.txt Downloads”命令时所在的目录中是否有一个名为“下载”的条目。根据之前存在的内容,这应该是以前称为“sample.txt”的文件,或者它应该包含“sample.txt”。
关于你展示的另外三个命令,它们本应不会产生任何变化,也不应该期望它们能提供有关第一个命令效果的任何有用信息。
如果当前目录中没有名为"sample.txt"的文件,那么
find sample.txt
将不会显示任何内容。如果你想要查找当前目录中包含名为"sample.txt"的文件,无论是直接还是间接包含在内,你可以使用
find . -name sample.txt
。(当然,这不会找到文件名已经不是"sample.txt"的文件。)
在
mv .. sample.txt
中,
..
是父目录的名称,即当前目录所在的目录。如果当前目录是
/
,那么父目录就是
/
本身。每个目录都有一个
..
的入口,表示父目录。该命令试图将父目录的
..
入口重命名为"sample.txt"。这个操作应该会失败,并显示一个错误消息,可能会有点令人困惑,错误消息会报告为"设备或资源忙"。
在
mv ... sample.txt
中,
...
并没有特殊处理。目录总是包含特殊条目
.
和
..
,但名称
...
并不特殊。所以你可能没有一个名为
...
的文件。
假设你没有这样做,那么该命令将失败并且不会产生任何更改。
如果当前目录中确实有一个名为“...”的文件,并且没有名为“sample.txt”的目录(也没有指向目录的符号链接命名为“sample.txt”),那么“...”将被重命名为“sample.txt”。如果“sample.txt”已经存在并且既不是目录也不是指向目录的符号链接,则“sample.txt”将被替换掉,除非它还存在其他硬链接,否则恢复可能会很困难或不可能,这取决于文件系统后续写入了多少次。然而,这种情况很不可能发生,因为你可能从未有过一个名为“...”的文件,并且在运行该命令之前很可能成功地将“sample.txt”重命名为其他位置,或者将其放置在其他位置,而且在你运行命令的目录中目前也看不到名为“sample.txt”的文件。
在极少数情况下,如果当前目录中既有一个名为“...”的条目,又有另一个名为“sample.txt”的目录或指向目录的符号链接条目,“mv ... sample.txt”将尝试将“...”移动到“sample.txt”目录中(或者移动到符号链接所指向的目录中)。
.
指的是当前目录,..
指的是父目录。在Ubuntu中没有隐藏文件这样的概念。隐藏文件只是以.
开头命名,例如.sample
。你运行了任何移动文件的命令吗? - Kulfysudo
运行mv
时,将一个不存在的绝对路径文件作为目标。在这个问题中,一个当前目录中不存在的相对路径文件被错误地用作mv
的目标(没有sudo
)。这影响到答案的措辞,但原则是相同的。其他差异甚至更小。这可能被视为那个问题的重复。 - Eliah Kagan