所以,如果我在我的主目录下,我想把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,但我想检查一下,看看是否有人有更好的主意。
当前回答
代码:
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'
其他回答
下面的一行代码怎么样(在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
保存为名为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
这些都是根据克里斯·卢茨提交的。
代码:
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'
$what=/path/to/file;
$dest=/dest/path;
mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))