6

我经常执行以下命令:

mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist

然后,我意识到我的文件不见了。即使在文件夹“$something_that_does_not_exist”中我也看不到它们。我的文件和文件夹到哪里去了?我怎样才能让他们回来?

4

5 回答 5

10

为了防止这个问题,我习惯在使用cpor时总是在目录名称的末尾附加 / mv

$ touch foo
$ mv foo bar/
mv: cannot move `foo' to `bar/foo': No such file or directory

如果没有尾部斜杠,mv则执行文件重命名操作。您可能会发现您的文件已更改名称。

于 2009-05-01T00:47:34.117 回答
2

如果$something_that_does_not_exist扩展为空(但我不确定这是否是您的问题?)那么第一个 mv 将失败。第二个 mv 命令也将失败,除非"files*"扩展为恰好两个文件,或者最后一个文件名"files*"扩展为恰好是一个目录。然后文件将被移动到该目录。

如果命令在脚本中,并且您希望脚本在尝试扩展变量且未设置时中止,则可以使用问号修饰符。例子:

$ 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未设置,则不会执行以下命令。

于 2009-05-01T00:52:56.943 回答
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
于 2009-05-01T00:49:25.470 回答
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

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

于 2009-05-01T01:09:52.893 回答
0

1)您尝试移动目录“文件夹”:

mv folder abcde

如果“abcde”是一个现有目录,它会将“文件夹”移动到“abcde”中。如果“abcde”是现有文件,该命令将失败。否则它将把“文件夹”重命名为“abcde”。

2)您尝试移动一些文件:

mv files* abcde

如果“abcde”是一个现有目录,它会将“files*”移动到“abcde”中。否则,如果只有一个文件匹配“files*”,它将将该文件重命名为“abcde”。否则命令将失败。

于 2009-05-01T01:19:49.173 回答