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

mv foo.c ~/bar/baz/ 

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


当前回答

Rsync命令只能在目标路径的最后一个目录不存在的情况下才能实现,例如,对于目标路径~/bar/baz/,如果bar存在而baz不存在,则可以使用以下命令:

Rsync -av——remove-source-files foo.c ~/bar/baz/

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
--remove-source-files   sender removes synchronized files (non-dir)

在这种情况下,如果baz目录不存在,将创建它。但如果bar和baz都不存在,rsync将失败:

sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

所以基本上使用rsync -av——remove-source-files作为mv的别名应该是安全的。

其他回答

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

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

下面的一行代码怎么样(在bash中):

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

分解一下:

mkdir --parents ./some/path
# if it doesn't work; try
mkdir -p ./some/path

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

mv yourfile.txt $_

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

我不确定这在其他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 /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt

根据另一个答案的注释,这是我的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应该会成功。