V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
EyebrowsWhite
V2EX  ›  Linux

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

  •  
  •   EyebrowsWhite ·
    eyebrowkang · 2022-02-16 21:34:39 +08:00 · 3383 次点击
    这是一个创建于 770 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2022-02-16 22:32:03 +08:00

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

    20 条回复    2022-04-18 01:58:37 +08:00
    conanforever22
        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
    cweijan
        3
    cweijan  
       2022-02-16 22:05:59 +08:00
    没有这样的命令, 你只能写个 shell 实现并加到环境变量使其成为一个新命令
    EyebrowsWhite
        4
    EyebrowsWhite  
    OP
       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
        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
    EyebrowsWhite
        6
    EyebrowsWhite  
    OP
       2022-02-16 22:35:22 +08:00
    @conanforever22 #5 非常感谢,可以的,这样子就没那条提示了(虽然还是需要两条命令)
    qwq11
        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
    LotusChuan
        8
    LotusChuan  
       2022-02-17 00:25:05 +08:00
    你可以写个函数重载 mv ,然后配置到资源文件里面。
    mikeguan
        9
    mikeguan  
       2022-02-17 00:57:50 +08:00 via Android   ❤️ 1
    mv:只做一件事
    Tink
        10
    Tink  
       2022-02-17 01:17:48 +08:00 via Android
    你这还好吧,就创建一个文件夹而已,我经常是要创建的这个 newDir 还会和既有的某个文件重名,更麻烦
    EyebrowsWhite
        11
    EyebrowsWhite  
    OP
       2022-02-17 09:08:38 +08:00 via iPhone
    @cweijan #3
    @qwq11 #7
    @LotusChuan #8 感谢几位的回复,写一个实现也不是不行,只是自己水平有限,写起来略麻烦,我是想问问看有没有现成的

    @mikeguan #9 如果 mv 不行,有没有其他命令可以实现呢🌝
    EyebrowsWhite
        12
    EyebrowsWhite  
    OP
       2022-02-17 09:10:44 +08:00 via iPhone
    @EyebrowsWhite 另外就是我觉得最方便的还是一条命令,其次两条,再是自己写,因为我会在不同机器上执行
    codehz
        13
    codehz  
       2022-02-17 10:41:56 +08:00
    用 extglob 还是太扭曲了(需要开扩展,而且 zsh/bash 都不一样)。。。
    给个稍微长一点,但是不用这么扭曲的方法吧
    LIST=(*)
    mkdir newDir
    mv ${LIST[*]} newDir
    killva4624
        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 (哪怕是已空)。
    debuggerx
        15
    debuggerx  
       2022-02-17 10:57:43 +08:00
    试试这个:
    rsync -aP ./ ./newDir
    不过好像只有第一次执行是预期的效果,第二次再执行就会把 newDir 再复制一份到 newDir 的里面了
    EyebrowsWhite
        16
    EyebrowsWhite  
    OP
       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
        17
    EyebrowsWhite  
    OP
       2022-02-17 12:19:53 +08:00
    @Tink 额,所以老哥怎么解决的啊,多条命令吗
    EyebrowsWhite
        18
    EyebrowsWhite  
    OP
       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
        19
    dier  
       2022-02-17 14:08:53 +08:00
    ```mv * ./newDir || ( mkdir ./newDir ; mv * ./newDir)```
    如果./newDir 不存在,则执行|| 后面的命令
    maichaide
        20
    maichaide  
       2022-04-18 01:58:37 +08:00
    mkdir <newdir>&&find . -type f -exec mv {} <newdir> \;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3664 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:43 · PVG 18:43 · LAX 03:43 · JFK 06:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.