EyebrowsWhite
V2EX  ›  Linux

使用 Linux 的 mv 命令移动文件时的问题

By EyebrowsWhite at 2022 年 2 月 16 日 · 4642 次点击

我有时候会有这样一种需求,将当前目录下的所有文件及文件夹移动到当前目录下的一个不存在的目录(需要新建),

如下图,在 example 下新建一个名为 newDir 的文件夹,并将a.txt b.txt aDir移动到newDir中,

我使用 mv 命令输入mv * ./newDir, 会提示mv: ./newDir is not a directory。

想问下各位,我的这个需求 mv 命令是不是无法做到,有什么命令可以做到这个吗

第 1 条附言  ·  2022 年 2 月 16 日

使用一楼的方法可以比较简单的完成需求,就是需要两条命令,而且有个提示总感觉不够优雅(强迫症犯了🙃)

20 条回复  •  2022-04-18 01:58:37 +08:00
conanforever22
   2
conanforever22  
   2022 年 2 月 16 日
如果用的 bash 可以试试
mkdir -p newDir && mv !(newDir) newDir/

提示命令有误的话 shopt -s extglob

参考: https://stackoverflow.com/a/18143395/3384328
cweijan
   3
cweijan  
   2022 年 2 月 16 日
没有这样的命令, 你只能写个 shell 实现并加到环境变量使其成为一个新命令
EyebrowsWhite
   4
EyebrowsWhite  
OP
   2022 年 2 月 16 日
@nightwitch #1 这个就相当于先新建 newDir 目录,再执行`mv * ./newDir`,是可以成功做到的,不过会提示`mv: rename newDir to ./newDir/newDir: Invalid argument`

@conanforever22 #2 额,用的 zsh ,试了下没有这个设置使用正则的命令
conanforever22
   5
conanforever22  
   2022 年 2 月 16 日
@EyebrowsWhite zsh 也有 extendedglob

setopt extendedglob
mv ^foo foo/

参考: https://zsh.sourceforge.io/Intro/intro_2.html
EyebrowsWhite
   6
EyebrowsWhite  
OP
   2022 年 2 月 16 日
@conanforever22 #5 非常感谢,可以的,这样子就没那条提示了(虽然还是需要两条命令)
shxxy
   7
shxxy  
   2022 年 2 月 16 日
export function mv-with-create() {
if 文件夹不存在; then
# mkdir -p $2
fi
/bin/mv $@
}

alias mv=mv-with-create
LotusChuan
   8
LotusChuan  
   2022 年 2 月 17 日
你可以写个函数重载 mv ,然后配置到资源文件里面。
mikeguan
   9
mikeguan  
   2022 年 2 月 17 日 via Android   ❤️ 1
mv:只做一件事
Tink
   10
Tink  
   2022 年 2 月 17 日 via Android
你这还好吧,就创建一个文件夹而已,我经常是要创建的这个 newDir 还会和既有的某个文件重名,更麻烦
EyebrowsWhite
   11
EyebrowsWhite  
OP
   2022 年 2 月 17 日 via iPhone
@cweijan #3
@qwq11 #7
@LotusChuan #8 感谢几位的回复,写一个实现也不是不行,只是自己水平有限,写起来略麻烦,我是想问问看有没有现成的

@mikeguan #9 如果 mv 不行,有没有其他命令可以实现呢🌝
EyebrowsWhite
   12
EyebrowsWhite  
OP
   2022 年 2 月 17 日 via iPhone
@EyebrowsWhite 另外就是我觉得最方便的还是一条命令,其次两条,再是自己写,因为我会在不同机器上执行
codehz
   13
codehz  
   2022 年 2 月 17 日
用 extglob 还是太扭曲了(需要开扩展,而且 zsh/bash 都不一样)。。。
给个稍微长一点,但是不用这么扭曲的方法吧
LIST=(*)
mkdir newDir
mv ${LIST[*]} newDir
killva4624
   14
killva4624  
   2022 年 2 月 17 日
因为 mv 只能做一件事情,所以要么增加别的命令辅助,要么换命令。比如 rsync:

mkdir dir1 dir2
touch root_file dir1/1_file dir2/2_file
rsync -av -R --remove-source-files * ./newDir

不过 rsync 也有个小毛病,--remove-source-files 不会删除原来的目录 dir1 dir2 (哪怕是已空)。
debuggerx
   15
debuggerx  
   2022 年 2 月 17 日
试试这个:
rsync -aP ./ ./newDir
不过好像只有第一次执行是预期的效果,第二次再执行就会把 newDir 再复制一份到 newDir 的里面了
EyebrowsWhite
   16
EyebrowsWhite  
OP
   2022 年 2 月 17 日
@codehz #13 是有点长了,不过可行 `LIST=(*) && mkdir newDir && mv ${LIST[*]} newDir`

@killva4624 #14 确实,另外感觉 -R 没必要,我直接运行 rsync -av --remove-source-files * ./newDir ,也可以
@debuggerx #15 你这个相当于 cp ,要结合楼上的--remove-source-files 选项
以前还真不知道有 rsync 这个命令,还搜到了阮一峰的教程 https://www.ruanyifeng.com/blog/2020/08/rsync.html
EyebrowsWhite
   17
EyebrowsWhite  
OP
   2022 年 2 月 17 日
@Tink 额,所以老哥怎么解决的啊,多条命令吗
EyebrowsWhite
   18
EyebrowsWhite  
OP
   2022 年 2 月 17 日
@codehz #13 另外就是,你这个相当于是把新建文件夹之前的所有文件名保存下来,新建 newDir 之后再引用吧,我不确定这个提示会不会有其他影响,`mv: rename newDir to ./newDir/newDir: Invalid argument`,如果没有的话感觉用一楼的`mkdir -p newDir && mv * ./newDir`命令更短一些
dier
   19
dier  
   2022 年 2 月 17 日
```mv * ./newDir || ( mkdir ./newDir ; mv * ./newDir)```
如果./newDir 不存在,则执行|| 后面的命令
maichaide
   20
maichaide  
   2022 年 4 月 18 日
mkdir <newdir>&&find . -type f -exec mv {} <newdir> \;
Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
© 2026 V2EX · 39ms · 3.9.8.5