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

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

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

mv foo.c ~/bar/baz/

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

12个解决方案

215 votes

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

KarstenF answered 2019-03-11T11:39:21Z

47 votes

mkdir -p `dirname /destination/moved_file_name.txt`

mv /full/path/the/file.txt /destination/moved_file_name.txt

Billmc answered 2019-03-11T11:39:38Z

19 votes

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

Sepero answered 2019-03-11T11:40:17Z

12 votes

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

strager answered 2019-03-11T11:40:50Z

5 votes

可能是以下shell脚本?

#!/bin/sh

if [[ -e $1 ]]

then

if [[ ! -d $2 ]]

then

mkdir --parents $2

fi

fi

mv $1 $2

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

Chris Lutz answered 2019-03-11T11:41:24Z

3 votes

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

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

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

Pat answered 2019-03-11T11:41:58Z

2 votes

Sillier,但工作方式:

mkdir -p $2

rmdir $2

mv $1 $2

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

Blarn Blarnson answered 2019-03-11T11:42:33Z

2 votes

最简单的方法是:mkdir [directorie name] && mv [filename] $_

假设我下载了位于我的下载directorie中的pdf文件(〜/ download),我想在一个没有退出的导演中移动所有文件(让我们说“my_PDF”)。

我将输入以下命令(确保我当前的工作目录os~ / download):

mkdir my_PDF && mv *.pdf $_

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

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

Abdoul Seibou answered 2019-03-11T11:43:24Z

1 votes

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

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}

它创建了3个目录(directory1,directory2,directory3),在每个子目录中都有两个子目录(子目录1,子目录2),并且在每个子目录中有两个子子目录(subsubdirectory1和subsubdirectory2)。

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

Stefan Gruenwald answered 2019-03-11T11:44:20Z

0 votes

$what=/path/to/file;

$dest=/dest/path;

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

mv "$what" "$dest"

cab404 answered 2019-03-11T11:44:39Z

0 votes

我的一个解决方案:

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

Andrey answered 2019-03-11T11:45:04Z

0 votes

码:

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'

John Doe answered 2019-03-11T11:45:33Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值