将文件和文件夹意外地移动到不存在的位置

6

我经常执行以下命令:

mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist

接着,我发现我的文件不见了。即使在"$something_that_does_not_exist"文件夹中也找不到它们。我的文件和文件夹去哪了?该怎么找回它们呢?

5个回答

11
为了避免这个问题,我有一个习惯,当使用cpmv时,总是在目录名后面添加一个/:
$ touch foo
$ mv foo bar/
mv: cannot move `foo' to `bar/foo': No such file or directory

如果没加斜杠,mv 就会执行文件重命名操作。你可能会发现你的文件已经改变了名称。


2
如果$something_that_does_not_exist没有被扩展为任何内容(但我不确定这是否是你的问题?),那么第一个mv命令将失败。除非"files*"恰好扩展为两个文件,或者最后一个文件名"files*" 恰好是一个目录,否则第二个mv命令也会失败。然后,文件将被移动到该目录中。
如果命令在脚本中,并且您希望在尝试扩展变量并未设置时使脚本中止,您可以使用问号修饰符。例如:
$ echo ${DISPLAY?}; echo display
:0.0
display
$ echo ${MYTEST?}; echo mytest
bash: MYTEST: parameter null or not set
$

所以,如果你使用

mv folder ${something_that_does_not_exist?}

如果 something_that_does_not_exist 没有被设置,那么其后的命令将不会被执行。

1
你正在正确的轨道上。这个事件与最后一个命令有关。我推理错误,认为第一件事会发生,但我注意到了最后一件事。我仍然相当困惑为什么这件事会发生。 - Léo Léopold Hertz 준영

0

由于shell将会展开您的文件,并且我相信列表中的最后一个文件现在将被称为$ something_that_does_not_exist,因此您将无法恢复您的文件。

列表中的所有其他文件都将被覆盖。因此您不能取回它们。

编辑:在我的smoothwall虚拟机上(这是我唯一能操作的GNU / Linux系统!)我得到了这个:

$ mkdir t1
$ mv t1 t2
$ ls
t2/
$ mv t2 t1
$ cd t1
$ touch f1 f2 f3 f4
$ mv f* ../t2
mv: target `../t2' is not a directory

好的,我的错误假设是$something_that_does_not_exist是您要键入的内容,而不是一个shell变量。正如其他人所说,这将失败。 - Wayne
我认为这是一个玩笑问题,所以 mv files* /dev/null 可能是更好的回答 :) - Wayne

0
mv folder $something_that_does_not_exist

这应该是一个错误:

$ mkdir folder
$ mv folder
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2

另一种情况取决于匹配的files*
mv files* $something_that_does_not_exist

如果最终匹配的是一个目录,你很可能会在那里找到你的文件。否则,你要么将第一个文件重命名为与第二个相同,要么出现了上述的另一个错误。


0

1) 你试图移动目录"folder":

mv folder abcde

如果 "abcde" 是一个现有目录,则会将 "folder" 移动到 "abcde" 中。 如果 "abcde" 是一个现有文件,则命令将失败。 否则它将重命名 "folder" 为 "abcde"。 2) 您正在尝试移动某些文件:
mv files* abcde

如果 "abcde" 是一个已存在的目录,则会将 "files*" 移动到 "abcde" 中。否则,如果只有一个文件与 "files*" 匹配,则将该文件重命名为 "abcde"。否则该命令将失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接