我经常执行以下命令:

mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist

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

有帮助吗?

解决方案

为了防止出现这个问题,我习惯在使用 cp mv 时始终在目录名的末尾添加/:

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

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

其他提示

如果 $ 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 ,将不会执行以下命令。

您将无法恢复文件,因为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
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

如果最终匹配是目录,您可能会在那里找到您的文件。否则,您将重命名第一个文件与第二个文件相同,或者上面有另一个错误。

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

mv folder abcde

如果“abcde”是现有目录,它将移动“文件夹”。进入“abcde”。如果是“abcde”是现有文件,命令将失败。否则它将重命名“文件夹”。到“abcde”。

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

mv files* abcde

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top