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

mv foo.c ~/bar/baz/ 

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


当前回答

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

其他回答

在将文件批量移动到新的子目录时,我经常遇到这个问题。理想情况下,我想这样做:

mv * newdir/  

这个线程中的大多数答案都建议mkdir然后mv,但这导致:

mkdir newdir && mv * newdir 
mv: cannot move 'newdir/' to a subdirectory of itself

我面临的问题略有不同,因为我想全面移动所有内容,并且,如果我在移动之前创建了新目录,那么它也会尝试将新目录移动到自己。所以,我通过使用父目录来解决这个问题:

mkdir ../newdir && mv * ../newdir && mv ../newdir .

警告:不能在根文件夹(/)中工作。

保存为名为mv.sh的脚本

#!/bin/bash
# mv.sh
dir="$2" # Include a / at the end to indicate directory (not filename)
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

或者在~/后面加上。Bashrc文件作为一个函数,在每个新终端上替换默认mv。使用函数可以让bash保持内存,而不必每次都读取脚本文件。

function mvp ()
{
    dir="$2" # Include a / at the end to indicate directory (not filename)
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

使用示例:

mv.sh file ~/Download/some/new/path/ # <-End with slash

这些都是根据克里斯·卢茨提交的。

更傻,但有效的方式:

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

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

代码:

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'

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

## 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。