![当我“mv *”时发生了什么?没有显示任何错误,现在只剩下一个文件夹。为什么?](https://linux22.com/image/1405602/%E5%BD%93%E6%88%91%E2%80%9Cmv%20*%E2%80%9D%E6%97%B6%E5%8F%91%E7%94%9F%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E4%BB%BB%E4%BD%95%E9%94%99%E8%AF%AF%EF%BC%8C%E7%8E%B0%E5%9C%A8%E5%8F%AA%E5%89%A9%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E3%80%82%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F.png)
执行的命令是“mv space *”,位于包含 14 GB 数据的文件夹中。
mv *
du -hs
是一样的,那么 14 GB 的数据去哪儿了?我做了什么?
答案1
我的猜测是 bash 扩展了通配符,从而将每个文件夹移动到最后一个文件夹中。
例如:
$ ls
test1 test2 test3 test4
$ mv *
$ ls
test4
$ ls test4
test1 test2 test3
这里,mv *
展开为mv test1 test2 test3 test4
与格式对应的mv [OPTION]... SOURCE... DIRECTORY
。这样,每个文件夹都移动到了最后一个。
答案2
正如@ssssteffff 所述,使用mv *
,shell 会从当前目录中的文件进行通配符扩展。但是命令的行为mv
取决于*
扩展到多少个参数。如果有两个以上的参数,则最后一个参数必须是目录:
mv [OPTION]... SOURCE... DIRECTORY
所以,
我创建了 5 个文件
$ touch 1 2 3 4 5
$ ls
1 2 3 4 5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1 2 3 4 5
现在,如果我创建一个目录,作为通配符扩展的最后一个参数,那么:
$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1 2 3 4 5
您应该仔细检查一下最后一个参数是什么。
- 如果最后一个参数是一个目录,那么您的数据可能是安全的。
- 如果参数的总数为 2,并且最后一个参数是目录,那么您的数据也许也是安全的。
- 如果参数总数为 2,并且最后一个参数是一个文件,那么第二个文件肯定不存在。
您确定没有看到类似这样的错误吗?
mv: target ‘5’ is not a directory`