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

问题描述 投票:214回答:15

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

mv foo.c ~/bar/baz/ 

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

linux macos unix mkdir mv
15个回答
241
投票

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

1
投票

只有当目标路径中的最后一个目录不存在时,rsync命令才能执行此操作。对于~/bar/baz/的目标路径,如果bar存在但baz不存在,则可以使用以下命令:

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

-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将失败:

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的别名应该是安全的。


0
投票
$what=/path/to/file;
$dest=/dest/path;

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

0
投票

我的一个解决方案:

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

0
投票

码:

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'

0
投票

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

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

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


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

55
投票
mkdir -p `dirname /destination/moved_file_name.txt`  
mv /full/path/the/file.txt  /destination/moved_file_name.txt

20
投票

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


13
投票

你可以使用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
投票

这听起来像答案是没有:)。我真的不想创建一个别名或func只是为了这样做,通常是因为它是一次性的,我已经在键入mv命令的中间,但我发现一些效果很好的东西:

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

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


5
投票

可能是以下shell脚本?

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

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


3
投票

最简单的方法是:

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

Let's suppose I downloaded pdf files located in my download directorie ( ~/download ) and I want to move all of then in a directorie that doesn't exit ( let's say "my_PDF" ).
I'll type the following commande ( making sure my current working directorie is ~/download ):

mkdir my_PDF && mv *.pdf $_

You can add -p option to mkdir if you want to create subdirectories just like this: (supposed i want to create a subdirectorie named "python" ):
mkdir -p my_PDF/python && mv *.pdf $_


2
投票

Sillier,但工作方式:

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

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


1
投票

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

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      
  • 它创建了3个目录(directory1,directory2,directory3), 在每个子目录中都有两个子目录(subdirectory1,subdirectory2), 并且在每个子目录中有两个子子目录(subsubdirectory1和subsubdirectory2)。

你必须使用bash 3.0或更新版本。

© www.soinside.com 2019 - 2024. All rights reserved.