RT.
mv a/* b/*
今天试了一个 mv 操作,将 a 的内容迁移到空目录 b 下,执行了上面的命令。结果 a 空了, b 目录下有个了*
total 8
~/space/workspace/t/b ls -an
-rw-r--r-- 1 1000 1000 0 4 月 27 15:44 '*'
drwxr-xr-x 2 1000 1000 4096 4 月 27 15:44 .
drwxr-xr-x 4 1000 1000 4096 4 月 27 15:44 ..
如果 a 下有多个文件,这样操作是不允许的,因此 a 下原本就一个文件。把 b/* 这个文件重命名即可,`mv \* new_name`
这里主要的问题是,你误以为
b/*
是目标
但其实 b/*展开之后,最后一个元素才是目标
mv a/* b/
可能文件已经回不来了? 跟移动到 /dev/null 差不多?
可是 b 目录下新出来的 * 文件大小是 0 ?
题主说 b 是空目录。
我在 Ubuntu 16.04 上的测试结果:
:$ ls a
a1 a2 a3
:$
:$ ls b
:$
:$ mv a/* b/*
mv: target 'b/*' is not a directory
:$
:$ ls a
a1 a2 a3
:$ ls b
:$
直接报错了,没有执行操作。
zsh 下会报错, 做了 alias
https://github.com/ohmyzsh/ohmyzsh/blob/9817e1e7ff62494abf9d7c78870e92908567e8f4/plugins/common-aliases/README.md/>mv mv -i Move a file
```
```bash
-i, --interactive
prompt before overwrite
```
```bash
[email&docker run -it --rm debian bash
[email&cd
[email&mkdir a b
[email&touch a/{1..10}.txt
[email&ls -R a
a:
1.txt 10.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
[email&/bin/mv a/* b/*
/bin/mv: target 'b/*' is not a directory
[email&/bin/mv -f a/* b/*
/bin/mv: target 'b/*' is not a directory
[email&rm a/{2..10}.txt
[email&ls -R a
a:
1.txt
[email&/bin/mv a/* b/*
[email&ls b/
'*'
```
确实,试了几个发行版,b/* 是 a/1.txt
说下事情经过
昨天 有个小伙伴 x51 云一个盘满了,开了一个新盘,就搞了个 mv a/* b/*,后面就是一顿猛虎操作(重启大法),重启后 原目录正常。
总结下:
1. 跨盘 mv 没有创建多文件(夹),多版本测试,给 v2 友造成困扰
2. 很有可能小伙伴 乌龙了
3. 感谢 @taolu
我试一下去
[[email&~]mkdir a
[[email&~]mkdir b
[[email&~]cd a
[[email&a]touch 1.txt 2.txt
[[email&a]ls
1.txt 2.txt
[[email&a]cd ..
[[email&~]mv a/* b/*
mv: 目标"b/*" 不是目录
这种问题牢记一点就可以了——通配符是由 shell 展开的(这点和 Windows 不同),而且不同 shell 下的行为可能有细微的差别
所以 `mv a/* b/*` 就相当于 `mv a 下的文件 1 a 下的文件 2 ... b 下的文件 1 b 下的文件 2 ...`
而当通配符展开失败时(比如 b 目录下没有文件),bash 的默认行为是原样输出,而 zsh 默认行为则是直接报错(赞一波 zsh )