所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入

mv foo.c ~/bar/baz/ 

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


当前回答

对于这个问题,有很多相互矛盾的解决方案,以下是对我们有效的解决方案:

## ss_mv ##
function ss_mv {
    mkdir -p $(dirname "$2") && mv -f "$@"
}

这里假设命令的语法如下:

ss_mv /var/www/myfile /var/www/newdir/myfile

通过这种方式,从命令的第二部分提取目录路径/var/www/newdir,然后创建新目录(使用dirname标记以避免将myfile添加到正在创建的新目录中是很关键的)。

然后我们继续使用“$@”标记对整个字符串再次进行mv。

其他回答

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

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      

创建3个目录(directory1, directory2, directory3), 每个目录中都有两个子目录(subdirectory1, subdirectory2), 每个目录中都有两个子目录(subsubdirectory1和subsubdirectory2)。

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

根据另一个答案的注释,这是我的shell函数。

# mvp = move + create parents
function mvp () {
    source="$1"
    target="$2"
    target_dir="$(dirname "$target")"
    mkdir --parents $target_dir; mv $source $target
}

将它包含在.bashrc或类似文件中,这样你就可以在任何地方使用它。

听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了这样做,通常是因为它是一次性的,我已经在输入mv命令的中间,但我发现了一些很好的工作:

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

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

$what=/path/to/file;
$dest=/dest/path;

mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"

你可以使用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 "$@"