首页 文章

有没有办法让mv创建要移动的目录,如果它不存在?

提问于
浏览
195

所以,如果我在我的主目录中并且我想将foo.c移动到〜/ bar / baz / foo.c,但那些目录不存在,是否有某种方法可以自动创建这些目录,以便你只需输入

mv foo.c ~/bar/baz/

一切都会成功吗?看起来你可以将mv改为一个简单的bash脚本,它会检查这些目录是否存在,如果不存在则会调用mkdir然后调用mv,但我想我会检查是否有人有更好的想法 .

12 回答

  • 1

    我的一个解决方案:

    test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
    
  • 0

    码:

    if [[ -e $1 && ! -e $2 ]]; then
       mkdir --parents --verbose -- "$(dirname -- "$2")"
    fi
    mv --verbose -- "$1" "$2"
    

    例:

    参数:“d1”“d2 / sub”

    mkdir: created directory 'd2'
    renamed 'd1' -> 'd2/sub'
    
  • 12

    最简单的方法是:

    mkdir [directorie name] && mv [filename] $_
    

    让's suppose I downloaded pdf files located in my download directorie ( ~/download ) and I want to move all of then in a directorie that doesn'退出(让我们说"my_PDF") .
    我将键入以下命令(确保我当前的工作主管是〜/下载):

    mkdir my_PDF && mv *.pdf $_
    

    You can add -p option to mkdir if you want to create subdirectories just like this: (我想要创建一个名为"python"的子目录):

    mkdir -p my_PDF/python && mv *.pdf $_
    
  • 0

    你甚至可以使用大括号扩展:

    mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
    
    • 创建3个目录(directory1,directory2,directory3),

    • 并且在每个子目录中都有两个子目录(subdirectory1,subdirectory2),

    • 并且在每个子目录中都有两个子子目录(subsubdirectory1和subsubdirectory2) .

    你必须使用bash 3.0或更新版本 .

  • 48
    $what=/path/to/file;
    $dest=/dest/path;
    
    mkdir -p "$(dirname "$dest")";
    mv "$what" "$dest"
    
  • 2

    这个单行(在bash中)怎么样:

    mkdir --parents ./some/path/; mv yourfile.txt $_
    

    打破这种情况:

    mkdir --parents ./some/path
    

    创建目录(包括所有中间目录),之后:

    mv yourfile.txt $_
    

    将文件移动到该目录($ _展开到传递给前一个shell命令的最后一个参数,即:新创建的目录) .

    我不确定这在其他炮弹中会有多大作用,但它可能会给你一些关于要寻找什么的想法 .

    以下是使用此技术的示例:

    $ > ls
    $ > touch yourfile.txt
    $ > ls
    yourfile.txt
    $ > mkdir --parents ./some/path/; mv yourfile.txt $_
    $ > ls -F
    some/
    $ > ls some/path/
    yourfile.txt
    
  • 3
    mkdir -p `dirname /destination/moved_file_name.txt`  
    mv /full/path/the/file.txt  /destination/moved_file_name.txt
    
  • 19

    保存为名为mv或mv.sh的脚本

    #!/bin/bash
    # mv.sh
    dir="$2"
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
    

    或者放在〜/ .bashrc文件的末尾,作为替换每个新终端上的默认mv的函数 . 使用函数允许bash保持内存,而不是每次都必须读取脚本文件 .

    function mv ()
    {
        dir="$2"
        tmp="$2"; tmp="${tmp: -1}"
        [ "$tmp" != "/" ] && dir="$(dirname "$2")"
        [ -a "$dir" ] ||
        mkdir -p "$dir" &&
        mv "$@"
    }
    

    这些基于Chris Lutz的提交 .

  • 0

    你可以使用 mkdir

    mkdir -p ~/bar/baz/ && \
    mv foo.c ~/bar/baz/
    

    一个简单的脚本自动执行(未经测试):

    #!/bin/sh
    
    # Grab the last argument (argument number $#)    
    eval LAST_ARG=\$$#
    
    # Strip the filename (if it exists) from the destination, getting the directory
    DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`
    
    # Move to the directory, making the directory if necessary
    mkdir -p "$DIR_NAME" || exit
    mv "$@"
    
  • 216

    可能是以下shell脚本?

    #!/bin/sh
    if [[ -e $1 ]]
    then
      if [[ ! -d $2 ]]
      then
        mkdir --parents $2
      fi
    fi
    mv $1 $2
    

    这是基本的部分 . 您可能希望添加一些内容来检查参数,如果目标存在,或者源目录存在,或者不存在(或者不覆盖不存在的内容),您可能希望更改行为 .

  • 5

    这听起来像答案是没有:) . 我没有't really want to create an alias or func just to do this, often because it'一次性,我已经在键入 mv 命令的中间,但我发现了一些效果很好的东西:

    mv *.sh  shell_files/also_with_subdir/ || mkdir -p $_
    

    如果 mv 失败(dir不存在),它将生成目录(这是上一个命令的最后一个参数,因此 $_ 有它) . 所以只需运行此命令,然后重新运行它,这次 mv 应该成功 .

  • 2

    Sillier,但工作方式:

    mkdir -p $2
    rmdir $2
    mv $1 $2
    

    使用mkdir -p创建包含共享目标文件名的临时目录的目录,然后使用简单的rmdir删除该文件名目录,然后将文件移动到新目标 . 我认为使用dirname的答案可能是最好的 .

相关问题