所以,如果我在我的主目录下,我想把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
# 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

这将把foo.c移动到新目录baz和父目录栏。

mv foo.c `mkdir -p ~/bar/baz/ && echo $_`

mkdir的-p选项将根据需要创建中间目录。 如果没有-p,路径前缀中的所有目录必须已经存在。

反引号' '内的所有内容都将被执行,输出将作为命令的一部分内联返回。 由于mkdir不返回任何东西,因此只有echo $_的输出将被添加到命令中。

$_引用前面执行的命令的最后一个参数。 在本例中,它将返回传递给mkdir命令的新目录(~/bar/baz/)的路径。 我解压缩了一个归档文件,但没有给出目的地,并希望将除demo-app.zip之外的所有文件从当前目录移动到一个名为demo-app的新目录。下面这句话就有效果:

mv `ls -A | grep -v demo-app.zip` `mkdir -p demo-app && echo $_`

ls -A返回包括隐藏文件在内的所有文件名(隐式文件除外)。和. .)。

管道符号|用于将ls命令的输出输送到grep(一个命令行、纯文本搜索实用程序)。 -v标志指示grep查找并返回除demo-app.zip之外的所有文件名。 该文件列表作为move命令mv的源参数添加到命令行。target参数是传递给mkdir的新目录的路径,使用$_引用并使用echo输出。

听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了这样做,通常是因为它是一次性的,我已经在输入mv命令的中间,但我发现了一些很好的工作:

mv *.sh  shell_files/also_with_subdir/ || mkdir -p $_

如果mv失败(dir不存在),它将使目录(这是上一个命令的最后一个参数,因此$_有它)。所以只要运行这个命令,然后重新运行它,这一次mv应该会成功。

利用“将最后一个参数传递给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/

对于这个问题,有很多相互矛盾的解决方案,以下是对我们有效的解决方案:

## ss_mv ##
function ss_mv {
    mkdir -p $(dirname "$2") && mv -f "$@"
}

这里假设命令的语法如下:

ss_mv /var/www/myfile /var/www/newdir/myfile

通过这种方式,从命令的第二部分提取目录路径/var/www/newdir,然后创建新目录(使用dirname标记以避免将myfile添加到正在创建的新目录中是很关键的)。

然后我们继续使用“$@”标记对整个字符串再次进行mv。