我有时候会有这样一种需求,将当前目录下的所有文件及文件夹移动到当前目录下的一个不存在的目录(需要新建),
如下图,在 example 下新建一个名为 newDir 的文件夹,并将a.txt b.txt aDir
移动到newDir
中,
我使用 mv 命令输入mv * ./newDir
, 会提示mv: ./newDir is not a directory
。
想问下各位,我的这个需求 mv 命令是不是无法做到,有什么命令可以做到这个吗
使用一楼的方法可以比较简单的完成需求,就是需要两条命令,而且有个提示总感觉不够优雅(强迫症犯了🙃)
1
nightwitch 2022-02-16 21:41:57 +08:00
|
2
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 |
3
cweijan 2022-02-16 22:05:59 +08:00
没有这样的命令, 你只能写个 shell 实现并加到环境变量使其成为一个新命令
|
4
EyebrowsWhite OP @nightwitch #1 这个就相当于先新建 newDir 目录,再执行`mv * ./newDir`,是可以成功做到的,不过会提示`mv: rename newDir to ./newDir/newDir: Invalid argument`
@conanforever22 #2 额,用的 zsh ,试了下没有这个设置使用正则的命令 |
5
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 |
6
EyebrowsWhite OP @conanforever22 #5 非常感谢,可以的,这样子就没那条提示了(虽然还是需要两条命令)
|
7
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 |
8
LotusChuan 2022-02-17 00:25:05 +08:00
你可以写个函数重载 mv ,然后配置到资源文件里面。
|
9
mikeguan 2022-02-17 00:57:50 +08:00 via Android 1
mv:只做一件事
|
10
Tink 2022-02-17 01:17:48 +08:00 via Android
你这还好吧,就创建一个文件夹而已,我经常是要创建的这个 newDir 还会和既有的某个文件重名,更麻烦
|
11
EyebrowsWhite OP @cweijan #3
@qwq11 #7 @LotusChuan #8 感谢几位的回复,写一个实现也不是不行,只是自己水平有限,写起来略麻烦,我是想问问看有没有现成的 @mikeguan #9 如果 mv 不行,有没有其他命令可以实现呢🌝 |
12
EyebrowsWhite OP @EyebrowsWhite 另外就是我觉得最方便的还是一条命令,其次两条,再是自己写,因为我会在不同机器上执行
|
13
codehz 2022-02-17 10:41:56 +08:00
用 extglob 还是太扭曲了(需要开扩展,而且 zsh/bash 都不一样)。。。
给个稍微长一点,但是不用这么扭曲的方法吧 LIST=(*) mkdir newDir mv ${LIST[*]} newDir |
14
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 (哪怕是已空)。 |
15
debuggerx 2022-02-17 10:57:43 +08:00
试试这个:
rsync -aP ./ ./newDir 不过好像只有第一次执行是预期的效果,第二次再执行就会把 newDir 再复制一份到 newDir 的里面了 |
16
EyebrowsWhite OP @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 |
17
EyebrowsWhite OP @Tink 额,所以老哥怎么解决的啊,多条命令吗
|
18
EyebrowsWhite OP @codehz #13 另外就是,你这个相当于是把新建文件夹之前的所有文件名保存下来,新建 newDir 之后再引用吧,我不确定这个提示会不会有其他影响,`mv: rename newDir to ./newDir/newDir: Invalid argument`,如果没有的话感觉用一楼的`mkdir -p newDir && mv * ./newDir`命令更短一些
|
19
dier 2022-02-17 14:08:53 +08:00
```mv * ./newDir || ( mkdir ./newDir ; mv * ./newDir)```
如果./newDir 不存在,则执行|| 后面的命令 |
20
maichaide 2022-04-18 01:58:37 +08:00
mkdir <newdir>&&find . -type f -exec mv {} <newdir> \;
|