我经常执行以下命令:
mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist
然后,我意识到我的文件不见了。即使在文件夹“$something_that_does_not_exist”中我也看不到它们。我的文件和文件夹到哪里去了?我怎样才能让他们回来?
为了防止这个问题,我习惯在使用cp
or时总是在目录名称的末尾附加 / 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”。否则命令将失败。