有没有办法使mv创build的目录被移动到,如果它不存在?

所以,如果我在我的主目录,我想将foo.c移动到〜/ bar / baz / foo.c,但这些目录不存在,是否有一些方法可以自动创build这些目录,你只需要input

mv foo.c ~/bar/baz/ 

一切都会解决? 好像你可以将mv别名为一个简单的bash脚本来检查这些目录是否存在,如果不存在,将会调用mkdir然后mv,但是我想我会检查是否有人有更好的主意。

这个单线(bash)如何?

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

打破这一点:

 mkdir --parents ./some/path 

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

 mv yourfile.txt $_ 

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

我不确定在其他shell中能够运行多久,但是它可能会给你一些关于寻找什么的想法。

这是一个使用这种技术的例子:

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

保存为名为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文件的末尾,作为replace每个新terminal的默认mv的函数。 使用一个函数允许bash保存它的内存,而不必每次都读取一个脚本文件。

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

这些基于Chris Lutz的提交。

你可以使用mkdir

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

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

 #!/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 "$@" 

下面的shell脚本,也许?

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

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

Sillier,但工作方式:

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

用mkdir -p制作目录,其中包括一个共享目标文件名的临时目录,然后用一个简单的rmdir删除该文件名目录,然后将文件移动到新的目的地。 我认为使用dirname的答案可能是最好的。

这听起来像答案是没有:)。 我真的不想创build一个别名或者func,通常是因为它是一次性的,而且我已经在inputmv命令了,但是我发现了一些很好的方法:

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

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

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

 mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2} 
  • 它创build3个目录(directory1,directory2,directory3),
    • 并在其中的每一个子目录(子目录1,子目录2),
      • 并在其中的每个子目录(subsubdirectory1和subsubdirectory2)。

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

最简单的方法是:

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

假设我下载了位于我的下载导演(〜/ download)中的pdf文件,并且我想将其全部移到不退出的导演(让我们说“my_PDF” )。
我会input下面的命令(确保我目前的工作导演是〜/下载):

 mkdir my_PDF && mv *.pdf $_ 

你可以添加-p选项到mkdir如果你想创build子目录就像这样 (假设我想创build一个名为“python”的子目录):

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

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

我一个string解决scheme

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