有没有办法使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)。
- 并在其中的每一个子目录(子目录1,子目录2),
你必须使用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/