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