所以,如果我在我的主目录中并且我想将foo.c移动到〜/ bar/baz/foo.c,但那些目录不存在,是否有某种方法可以自动创建这些目录,以便你只需输入
mv foo.c ~/bar/baz/
一切都会成功吗?看起来你可以将mv改为一个简单的bash脚本,它会检查这些目录是否存在,如果不存在则会调用mkdir然后调用mv,但我想我会检查是否有人有更好的想法.
这个单行(在bash中)怎么样:
mkdir --parents ./some/path/; mv yourfile.txt $_
打破这种情况:
mkdir --parents ./some/path
创建目录(包括所有中间目录),之后:
mv yourfile.txt $_
将文件移动到该目录($ _展开到传递给前一个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
保存为名为mv或mv.sh的脚本
#!/bin/bash # mv.sh dir="$2" tmp="$2"; tmp="${tmp: -1}" [ "$tmp" != "/" ] && dir="$(dirname "$2")" [ -a "$dir" ] || mkdir -p "$dir" && mv "$@"
或者放在〜/ .bashrc文件的末尾,作为替换每个新终端上的默认mv的函数.使用函数允许bash保持内存,而不是每次都必须读取脚本文件.
function mv () { dir="$2" tmp="$2"; tmp="${tmp: -1}" [ "$tmp" != "/" ] && dir="$(dirname "$2")" [ -a "$dir" ] || mkdir -p "$dir" && mv "$@" }
这些基于Chris Lutz的提交.
你可以使用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 "$@"
可能是以下shell脚本?
#!/bin/sh if [[ -e $1 ]] then if [[ ! -d $2 ]] then mkdir --parents $2 fi fi mv $1 $2
这是基本的部分.您可能希望添加一些内容来检查参数,如果目标存在,或者源目录存在,或者不存在(或者不覆盖不存在的内容),您可能希望更改行为.
听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了做到这一点,通常是因为它是一次性的,而且我已经在键入mv
命令了,但是我发现有一个很好的解决方案:
mv *.sh shell_files/also_with_subdir/ || mkdir -p $_
如果mv
失败(dir不存在),它将创建目录(这是上一个命令的最后一个参数,也是如此$_
)。因此,只需运行此命令,然后up重新运行它,这一次mv
应该会成功。