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

Is there a way to make mv create the directory to be moved to if it doesn't exist?

所以,如果我在我的主目录中,我想将foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,是否有一些方法可以自动创建这些目录,这样您只需键入

1
mv foo.c ~/bar/baz/

一切都会好起来的?似乎您可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想我将检查是否有人有更好的想法。


这一行怎么样(在bash中):

1
mkdir --parents ./some/path/; mv yourfile.txt $_

分解:

1
mkdir --parents ./some/path

创建目录(包括所有中间目录),之后:

1
mv yourfile.txt $_

将文件移动到该目录($扩展到上一个shell命令的最后一个参数,即:新创建的目录)。

我不确定这在其他外壳中能起到多大的作用,但它可能会给你一些关于寻找什么的想法。

下面是使用此技术的示例:

1
2
3
4
5
6
7
8
9
$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt


1
2
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt


另存为名为mv或mv.sh的脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
["$tmp" !="/" ] && dir="$(dirname"$2")"
[ -a"$dir" ] ||
mkdir -p"$dir" &&
mv"$@"

或者将~/.bashrc文件的末尾作为一个函数,替换每个新终端上的默认mv。使用函数允许bash保留内存,而不必每次都读取脚本文件。

1
2
3
4
5
6
7
8
9
function mv ()
{
    dir="$2"
    tmp="$2"; tmp="${tmp: -1}"
    ["$tmp" !="/" ] && dir="$(dirname"$2")"
    [ -a"$dir" ] ||
    mkdir -p"$dir" &&
    mv"$@"
}

这些都是基于克里斯·卢茨的提交。


您可以使用mkdir

1
2
mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/

自动执行(未测试)的简单脚本:

1
2
3
4
5
6
7
8
9
10
11
#!/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脚本?

1
2
3
4
5
6
7
8
9
#!/bin/sh
if [[ -e $1 ]]
then
  if [[ ! -d $2 ]]
  then
    mkdir --parents $2
  fi
fi
mv $1 $2

这是最基本的部分。您可能需要添加一点以检查参数,并且如果目标存在、源目录存在或不存在(即不覆盖不存在的内容),您可能需要更改行为。


听起来答案是否定的:)。我不想创建别名或func来完成这项工作,通常是因为它是一次性的,而且我已经在输入mv命令的过程中,但是我发现了一些很好的方法:

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

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


最简单的方法是:

1
 mkdir [directorie name] && mv [filename] $_

假设我下载了位于下载目录(~/download)中的PDF文件,并且我希望将所有文件都移动到不退出的目录中(比如说"我的PDF")。我将键入以下命令(确保我当前的工作目录是~/download):

1
mkdir my_PDF && mv *.pdf $_

如果您想创建这样的子目录,可以向mkdir添加-p选项:(假设我想创建一个名为"python"的子目录):

1
mkdir -p my_PDF/python && mv *.pdf $_


更愚蠢,但工作方式:

1
2
3
mkdir -p $2
rmdir $2
mv $1 $2

使用mkdir-p创建目录,包括共享目标文件名的临时目录,然后使用简单的rmdir删除该文件名目录,然后将文件移动到新的目标。不过,我认为用dirname来回答可能是最好的。


rsync命令只有在目的地路径中的最后一个目录不存在的情况下才能执行此操作,例如,对于EDOCX1的目的地路径(10),如果bar存在而baz不存在,则可以使用以下命令:

rsync -av --remove-source-files foo.c ~/bar/baz/

1
2
3
-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
--remove-source-files   sender removes synchronized files (non-dir)

在这种情况下,如果不存在baz目录,将创建该目录。但如果barbaz都不存在,rsync将失败:

1
2
3
sending incremental file list
rsync: mkdir"/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]

所以基本上,使用rsync -av --remove-source-files作为mv的别名应该是安全的。


甚至可以使用大括号扩展:

1
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
  • 它创建3个目录(目录1、目录2、目录3),
    • 其中每一个都有两个子目录(子目录1,子目录2),
      • 每个子目录中有两个子目录(子目录1和子目录2)。

您必须使用bash 3.0或更高版本。


1
((cd src-path && tar --remove-files -cf - files-to-move) | ( cd dst-path && tar -xf -))


您可以链接命令:mkdir ~/bar/baz | mv foo.c ~/bar/baz/。或者shell脚本在这里:

1
2
#!/bin/bash
mkdir $2 | mv $1 $2

1。打开任何文本编辑器2。复制粘贴外壳脚本。三。保存为mkdir_mv.sh4。输入脚本的目录:cd your/script/directory。5。更改文件模式:chmod +x mkdir_mv.sh。6。设置别名:alias mv="./mkdir_mv.sh"。现在,无论何时运行命令mv时,如果不存在,都将创建移动目录。


代码:

1
2
3
4
if [[ -e $1 && ! -e $2 ]]; then
   mkdir --parents --verbose --"$(dirname --"$2")"
fi
mv --verbose --"$1""$2"

例子:

参数:"d1""d2/sub"

1
2
mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'

我的单字符串解决方案:

1
test -d"/home/newdir/" || mkdir -p"/home/newdir/" && mv /home/test.txt /home/newdir/

1
2
3
4
5
$what=/path/to/file;
$dest=/dest/path;

mkdir -p"$(dirname"$dest")";
mv"$what""$dest"