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

2022-02-16 21:34:39 +08:00
 EyebrowsWhite

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

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

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

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

3626 次点击
所在节点    Linux
20 条回复
nightwitch
2022-02-16 21:41:57 +08:00
conanforever22
2022-02-16 21:46:20 +08:00
如果用的 bash 可以试试
mkdir -p newDir && mv !(newDir) newDir/

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

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

@conanforever22 #2 额,用的 zsh ,试了下没有这个设置使用正则的命令
conanforever22
2022-02-16 22:31:02 +08:00
@EyebrowsWhite zsh 也有 extendedglob

setopt extendedglob
mv ^foo foo/

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

alias mv=mv-with-create
LotusChuan
2022-02-17 00:25:05 +08:00
你可以写个函数重载 mv ,然后配置到资源文件里面。
mikeguan
2022-02-17 00:57:50 +08:00
mv:只做一件事
Tink
2022-02-17 01:17:48 +08:00
你这还好吧,就创建一个文件夹而已,我经常是要创建的这个 newDir 还会和既有的某个文件重名,更麻烦
EyebrowsWhite
2022-02-17 09:08:38 +08:00
@cweijan #3
@qwq11 #7
@LotusChuan #8 感谢几位的回复,写一个实现也不是不行,只是自己水平有限,写起来略麻烦,我是想问问看有没有现成的

@mikeguan #9 如果 mv 不行,有没有其他命令可以实现呢🌝
EyebrowsWhite
2022-02-17 09:10:44 +08:00
@EyebrowsWhite 另外就是我觉得最方便的还是一条命令,其次两条,再是自己写,因为我会在不同机器上执行
codehz
2022-02-17 10:41:56 +08:00
用 extglob 还是太扭曲了(需要开扩展,而且 zsh/bash 都不一样)。。。
给个稍微长一点,但是不用这么扭曲的方法吧
LIST=(*)
mkdir newDir
mv ${LIST[*]} newDir
killva4624
2022-02-17 10:53:33 +08:00
因为 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
2022-02-17 10:57:43 +08:00
试试这个:
rsync -aP ./ ./newDir
不过好像只有第一次执行是预期的效果,第二次再执行就会把 newDir 再复制一份到 newDir 的里面了
EyebrowsWhite
2022-02-17 12:18:52 +08:00
@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
2022-02-17 12:19:53 +08:00
@Tink 额,所以老哥怎么解决的啊,多条命令吗
EyebrowsWhite
2022-02-17 12:29:10 +08:00
@codehz #13 另外就是,你这个相当于是把新建文件夹之前的所有文件名保存下来,新建 newDir 之后再引用吧,我不确定这个提示会不会有其他影响,`mv: rename newDir to ./newDir/newDir: Invalid argument`,如果没有的话感觉用一楼的`mkdir -p newDir && mv * ./newDir`命令更短一些
dier
2022-02-17 14:08:53 +08:00
```mv * ./newDir || ( mkdir ./newDir ; mv * ./newDir)```
如果./newDir 不存在,则执行|| 后面的命令
maichaide
2022-04-18 01:58:37 +08:00
mkdir <newdir>&&find . -type f -exec mv {} <newdir> \;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX