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 ..
1
taolu 2020-04-27 17:53:20 +08:00 1
如果 a 下有多个文件,这样操作是不允许的,因此 a 下原本就一个文件。把 b/* 这个文件重命名即可,`mv \* new_name`
|
2
julyclyde 2020-04-27 18:13:45 +08:00
这里主要的问题是,你误以为
b/* 是目标 但其实 b/*展开之后,最后一个元素才是目标 |
3
ddzzhen 2020-04-27 18:24:39 +08:00 via Android
mv a/* b/
|
4
superrichman 2020-04-27 18:29:12 +08:00 via iPhone
可能文件已经回不来了? 跟移动到 /dev/null 差不多?
|
5
iFollow 2020-04-27 19:24:44 +08:00
|
6
server OP @iFollow zsh 下会报错, 做了 alias
https://github.com/ohmyzsh/ohmyzsh/blob/9817e1e7ff62494abf9d7c78870e92908567e8f4/plugins/common-aliases/README.md#file-handling ```zsh mv mv -i Move a file ``` ```bash -i, --interactive prompt before overwrite ``` |
7
taolu 2020-04-28 13:07:25 +08:00
@server
```bash root@ubuntu:~# docker run -it --rm debian bash root@fa9a52396d6f:/# cd root@fa9a52396d6f:~# mkdir a b root@fa9a52396d6f:~# touch a/{1..10}.txt root@fa9a52396d6f:~# ls -R a a: 1.txt 10.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt root@fa9a52396d6f:~# /bin/mv a/* b/* /bin/mv: target 'b/*' is not a directory root@fa9a52396d6f:~# /bin/mv -f a/* b/* /bin/mv: target 'b/*' is not a directory root@fa9a52396d6f:~# rm a/{2..10}.txt root@fa9a52396d6f:~# ls -R a a: 1.txt root@fa9a52396d6f:~# /bin/mv a/* b/* root@fa9a52396d6f:~# ls b/ '*' ``` |
8
server OP |
9
c7in7 2020-04-28 15:32:43 +08:00
我试一下去
|
10
c7in7 2020-04-28 15:34:54 +08:00
[root@c7in7 ~]# mkdir a
[root@c7in7 ~]# mkdir b [root@c7in7 ~]# cd a [root@c7in7 a]# touch 1.txt 2.txt [root@c7in7 a]# ls 1.txt 2.txt [root@c7in7 a]# cd .. [root@c7in7 ~]# mv a/* b/* mv: 目标"b/*" 不是目录 |
11
aloxaf 2020-05-06 15:09:37 +08:00
这种问题牢记一点就可以了——通配符是由 shell 展开的(这点和 Windows 不同),而且不同 shell 下的行为可能有细微的差别
所以 `mv a/* b/*` 就相当于 `mv a 下的文件 1 a 下的文件 2 ... b 下的文件 1 b 下的文件 2 ...` 而当通配符展开失败时(比如 b 目录下没有文件),bash 的默认行为是原样输出,而 zsh 默认行为则是直接报错(赞一波 zsh ) |