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

mv foo.c ~/bar/baz/ 

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


当前回答

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

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

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

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

其他回答

((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))

更傻,但有效的方式:

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

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

利用“将最后一个参数传递给shell脚本”中的技巧,我们可以创建一个简单的shell函数,无论你想移动多少个文件都能正常工作:

# Bash only
mvdir() { mkdir -p "${@: -1}" && mv "$@"; }

# Other shells may need to search for the last argument
mvdir() { for last; do true; done; mkdir -p "$last" && mv "$@"; }

使用如下命令:

mvdir foo.c foo.h ~/some/new/folder/

我在linux上用install命令完成了这一点:

root@logstash:# myfile=bash_history.log.2021-02-04.gz ; install -v -p -D $myfile /tmp/a/b/$myfile

bash_history.log.2021-02-04.gz -> /tmp/a/b/bash_history.log.2021-02-04.gz

唯一的缺点是文件权限被改变了:

root@logstash:# ls -lh /tmp/a/b/

-rwxr-xr-x 1 root root 914 Fev  4 09:11 bash_history.log.2021-02-04.gz

如果你不介意重置权限,你可以使用:

-g, --group=GROUP   set group ownership, instead of process' current group
-m, --mode=MODE     set permission mode (as in chmod), instead of rwxr-xr-x
-o, --owner=OWNER   set ownership (super-user only)
$what=/path/to/file;
$dest=/dest/path;

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