所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入
mv foo.c ~/bar/baz/
一切都会解决的吗?似乎可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想检查一下,看看是否有人有更好的主意。
所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入
mv foo.c ~/bar/baz/
一切都会解决的吗?似乎可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想检查一下,看看是否有人有更好的主意。
当前回答
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
其他回答
保存为名为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 directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
创建3个目录(directory1, directory2, directory3), 每个目录中都有两个子目录(subdirectory1, subdirectory2), 每个目录中都有两个子目录(subsubdirectory1和subsubdirectory2)。
您必须使用bash 3.0或更新版本。
更傻,但有效的方式:
mkdir -p $2
rmdir $2
mv $1 $2
使mkdir -p目录包含一个共享目标文件名的临时目录,然后使用简单的rmdir删除该文件名目录,然后将文件移动到其新目标。 我认为使用dirname回答可能是最好的。
最简单的方法是:
mkdir [directory name] && mv [filename] $_
让我们假设我下载了位于我的下载目录(~/download)中的pdf文件,我想将它们全部移动到一个不存在的目录(比如my_PDF)。
我将输入以下命令(确保我当前的工作目录是~/download):
mkdir my_PDF && mv *.pdf $_
如果你想创建子目录,你可以在mkdir中添加-p选项,就像这样(假设我想创建一个名为python的子目录):
mkdir -p my_PDF/python && mv *.pdf $_
听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了这样做,通常是因为它是一次性的,我已经在输入mv命令的中间,但我发现了一些很好的工作:
mv *.sh shell_files/also_with_subdir/ || mkdir -p $_
如果mv失败(dir不存在),它将使目录(这是上一个命令的最后一个参数,因此$_有它)。所以只要运行这个命令,然后重新运行它,这一次mv应该会成功。