当前位置:  开发笔记 > 运维 > 正文

有没有办法让mv创建要移动的目录,如果它不存在?

如何解决《有没有办法让mv创建要移动的目录,如果它不存在?》经验,为你挑选了6个好方法。

所以,如果我在我的主目录中并且我想将foo.c移动到〜/ bar/baz/foo.c,但那些目录不存在,是否有某种方法可以自动创建这些目录,以便你只需输入

mv foo.c ~/bar/baz/ 

一切都会成功吗?看起来你可以将mv改为一个简单的bash脚本,它会检查这些目录是否存在,如果不存在则会调用mkdir然后调用mv,但我想我会检查是否有人有更好的想法.



1> KarstenF..:

这个单行(在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


很好的'$ _'.
奇怪的是,` - parent`在macOS 10.13.2上不可用.你需要使用`-p`.
对于新手,--parents可以简化为-p

2> 小智..:
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt


我是唯一意识到此代码没有意义的人?您以递归方式创建现有文件的绝对路径(这意味着该路径已存在),然后将文件移动到某个位置(在您的示例中不存在)。

3> Sepero..:

保存为名为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的提交.


这最准确地回答了问题恕我直言.用户想要增强的`mv`命令.特别适用于脚本编写,即您不一定要运行检查并在需要使用`mv`时运行`mkdir -p`.但是因为我想要`mv`的默认错误行为,我将函数名改为`mvp` - 所以我知道什么时候可以创建目录.
@UlisesLayera我修改了算法以使其更健壮。现在不应该崩溃

4> strager..:

你可以使用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 "$@"



5> Chris Lutz..:

可能是以下shell脚本?

#!/bin/sh
if [[ -e $1 ]]
then
  if [[ ! -d $2 ]]
  then
    mkdir --parents $2
  fi
fi
mv $1 $2

这是基本的部分.您可能希望添加一些内容来检查参数,如果目标存在,或者源目录存在,或者不存在(或者不覆盖不存在的内容),您可能希望更改行为.



6> Pat..:

听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了做到这一点,通常是因为它是一次性的,而且我已经在键入mv命令了,但是我发现有一个很好的解决方案:

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

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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有