在谷歌上搜索特殊字符很困难,这就是我在这里发布这个的原因。
我最近(以 root 身份)运行 a,mv /tmp/folder/* /*
当我打算运行时,mv /tmp/folder/* ./
大错特错了!
事情坏了!很多文件被混淆并放置在奇怪的地方,正常的 UNIX 命令都不起作用(ls、dir、cat 等),一旦你注销,你就无法通过 ssh 重新登录——它会给你一个提示,但不接受旧密码。
运行ls /*
表明它在/
.如果我尝试绘制一个平行线,那么mv
应该简单地将文件移动(或复制?)到/
.相反,非常奇怪的事情发生了,我只是好奇到底发生了什么。
更多信息: /tmp/folder 中的文件是从 Windows 计算机传输的,并被命名为 file (#).txt,其中 (#) 是最多两位数的数字,文件和括号之间有一个空格。这些文本文件大约有 40 个。
答案1
该mv
命令采用参数列表,这些参数可以是文件或目录。如果最后一个参数是目录,则所有其他参数都将移至该目录中。
在您的情况下,mv /tmp/folder/* /*
扩展为mv <the list of files in /tmp/folder> <the list of files in />
.因此,正如您可能猜到的,中的所有文件以及 除最后一个之外的/tmp/folders/
所有文件都被移动到 列出的最后一个文件夹中(可能是)。/
/*
/var
答案2
你想象mv
的论点是错误的。从手册页:
SYNOPSIS
mv [OPTION]... SOURCE... DIRECTORY
mv
需要很多SOURCE
参数,但只有一个目的地DIRECTORY
。mv
无法将文件移动到多个目的地,否则需要复制它。由于(正如您所说)/*
解析了 中的所有目录/
,所有这些目录(最后一个除外)都将被添加到列表中SOURCE
,因此您将所有这些目录移动到命令行上最后列出的目录中。
如果您从 LiveCD 启动并安装驱动器,则可能可以消除损坏;根目录中将只剩下一个目录(可能/var
),并且您可以将根目录中应包含的所有目录移出该目录
答案3
要检查命令到底做了什么,您可以通过在命令之前mv
添加来检查它,这样 shell 将展开所有通配符并打印结果命令,例如:echo
$ echo mv /tmp/folder/* /*
$ echo mv /tmp/* /*
mv /tmp/launch-4TgsLB /tmp/skl /bin /dev /etc /home /lost+found /mnt /net /opt /private /sbin /tmp /usr /var
所以基本上它会将您的文件移动到根系统中的最后一个文件夹,可能是/var
.
阅读更多:mv * 做什么?