关于`sudo mv home/* *`命令的作用及目标参数`*`的疑问
sudo mv home/* * 命令的作用是什么?为什么我的文件夹消失了?
这个命令的危险之处在于shell会先把两个*通配符展开成具体的文件/目录列表,再传给mv——第二个*并不是你以为的“目标文件夹”,最终导致你的home目录被移动到了当前目录下字典序最后的那个目录里,所以你在原位置看不到它了,具体拆解如下:
1. 通配符的提前展开逻辑
shell在执行任何命令前,都会优先处理命令里的通配符(比如*),把它们替换成匹配的所有非隐藏文件/目录名,按字典序排列。假设你在home的父目录下执行这个命令,当前目录里有home、documents、downloads、videos这几个目录,home下有pictures、music,那么你写的命令会被shell转换成:
sudo mv home/pictures home/music documents downloads home videos
2. mv命令的执行规则
mv的核心逻辑是:
- 当传入多个参数时,最后一个参数必须是目录,它会把前面所有的源文件/目录都移动到这个目录中;
- 如果最后一个参数是文件,且仅传入一个源,会将源重命名为该文件名;否则直接报错。
在上面的例子里,最后一个参数是videos(目录),所以mv会把home/pictures、home/music、documents、downloads、home全部移动到videos目录下。这就导致你原本在当前目录的home目录“消失”了——它并没有被删除,只是被转移到videos目录里了,你可以去该目录找回。
3. 为什么会出现意外?
你原本预期第二个*代表“目标文件夹”,但实际上它被展开成了当前目录下的所有非隐藏内容,包括home本身。最终mv把所有前面的源(包括home目录)都移动到了最后一个展开项对应的目录中,完全偏离了你的预期。
正确的做法
如果你的需求是把home下的所有内容移动到当前目录,应该使用明确的目标路径(.代表当前目录):
sudo mv home/* .
内容的提问来源于stack exchange,提问作者JCMiguel
相关产品推荐
相关产品推荐

