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,但是这些目录不存在,是否有一些方法可以自动创建这些目录,这样您只需键入
一切都会好起来的?似乎您可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想我将检查是否有人有更好的想法。
- 相关:stackoverflow.com/questions/1529946/…
这一行怎么样(在bash中):
1
| mkdir --parents ./some/path/; mv yourfile.txt $_ |
分解:
1
| mkdir --parents ./some/path |
创建目录(包括所有中间目录),之后:
将文件移动到该目录($扩展到上一个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 |
- 好吧,与"美元"。
- Agreed,but this is a less general solution.My solution could serve as a mv substitute(thus an alias in bash)(assuming it works properly-still untested!)否
- 为什么每次都有多余的EDOCX1出现?The Args are not commands in path without the EDOCX1
- For the newses,parents can be shortened to-p
- ODDLY,EDOCX1 plography 2…is not available on macos 10.13.2.你需要用字母名称3
- 如果移动到文件EG./Some/PATH/FO,就不可能工作。在这个情况下,指挥应该是:EDOCX1
1 2
| mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt |
- 我是唯一一个意识到这个代码毫无意义的人?您递归地创建现有文件的绝对路径(这意味着该路径已经存在),然后将该文件移动到一个位置(在您的示例中不存在)。
- @用户544262772 gnu coreutils的dirname不需要它的参数存在,它是纯字符串操作。不能代表其他发行版。这段代码没有问题。
另存为名为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"$@"
} |
这些都是基于克里斯·卢茨的提交。
- This answers the question most accurately Imho.The user would like an enhanced EDOCX1 penographic 5 command.特别是使用脚本,你不需要运行的车臣和运行EDOCX1的英文第6个字母。任何时候你需要使用EDOCX1的英文第5个字母。但是,由于我想为EDOCX1找到一个定义错误的行为方式,我把这个功能名称改为字母名称9,所以我知道当我可以创建目录。
- Seems like the best solution idea,but implementation crashes a lot.
- @uliseslayera我修改了算法,使其更加健壮。它现在不应该坠毁
- 有人能解释一下[ ! -a"$dir" ]的意思吗?我做过实验,右边的一半是对的,一半是错的,都是对的。????为了其他人的利益,tmp="$tmp:-1"似乎要抓取文件的最后一个字符,以确保它不是路径(/)
- @bazz应该这样做:"如果$dir不存在,那么继续"。很遗憾,您是正确的,使用""时有一个错误!-我不知道为什么。我已经编辑了一些代码,现在应该可以工作了。
您可以使用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"$@" |
- 当我跑"告诉我"?BAR/BAZ/,I get"/home/DMKEE/BAR",which is not what I want here…
- ?Dmcke,ah,you are right.有什么想法解决这个问题吗?If you input/bar/baz you ~ either(a)want to copy to ~/bar/and rename to baz,or(b)copy to ~/bar/baz/.What's the better tool for the job?
- 你可以使用"[-d"-$2"]'To sort it out,but that's not as pretty…
- @Dmcke,I've used regexp/渴to come up with a solution.你喜欢这工作吗?页:1
- nice,except$2 is not the last argument unless$35;=2.I have a program,la,that prints its last argument.I used to use i t in a version of the CP Command(to add the current directory if the last argument wasn't a directory).即使是现代壳牌公司也会支持1美元,只有9美元,一个珍珠脚本可能是更好的。
- @Leffler,not true-I know bash supports more than 9 arguments(using${123}is one method).I don't know perl,so feel free to make an answer yourself.页:1
- And even if you're using a plain vanilla/bin/sh,you can loop over'store================================Though at that point we've lost any semblance of elegance the script might have had.
- Dmcke,I was going to try shift,but they found a more element solution.See update.
可能是下面的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 |
这是最基本的部分。您可能需要添加一点以检查参数,并且如果目标存在、源目录存在或不存在(即不覆盖不存在的内容),您可能需要更改行为。
- With your code,the move isn't performed if the directory does not exist!
- And you missed the-p"flag to mkdir.
- 如果一个董事会不存在,为什么要创建它,如果你只是去移动它?(P flag fixed)
- I mean,when you run the script and the directory$2 does not exist,it is created but the file is not copied.
- 他就如何扩大这项工作,提出了一个简单的结构和进一步的资料。为什么要投票?喂
- 克劳瑟但是,为什么你要在文件不存在的情况下建设目标目录?
- @YPNES:because so far it doesn't do what it is supposed to?
- and I haven't fixed i t myself for educatical reasons.
- 哦,赫克。我想要我的观点回来。
- The logic here:no point in try the move unless$1 exists,then if the target does not exist,make it.我可能想增加一个测试,所以我们不超过有一个正常的文件名。
- 好吧,所以我第一次不明白为什么克里斯?卢兹检查1美元,因为2美元是董事会要创建。但是Chris Lutz是绝对正确的,如果$1 does not exist mv will raise an mistake and there one may also not want the designation directory to be created.In the second if-condition one may not only test for existance of type directory but for existance regardless of type.如果存在这种情况,而且这种情况是一种文件,那么即使采用了备选办法,也会造成一种错误(BTW.which it will not do for an existing directory with-p option on archlinux)。So I suggest to test for existance regardless of
- Type.and finally@dmckee's last point:if one wants this function/script to behave like the standard MV apart from creating nested directions,than one shall not Add a test whether we are copying a file or a directory.但是,对一种需要的依赖可能有所不同。So if you dmcke meant this as optional we both agree;.
听起来答案是否定的:)。我不想创建别名或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来回答可能是最好的。
- 是的,有点傻。:-)如果$2是一个目录(如最初的问题中),那么它会非常糟糕地失败,因为最后一个目录将被删除,所以"mv"将失败。如果$2已经存在,它也会尝试删除它。
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目录,将创建该目录。但如果bar和baz都不存在,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} |
您必须使用bash 3.0或更高版本。
- Interesting,but doesn't answer the OP's question.
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" |
- 要使其独立于sh脚本,只需将$dest和$src替换为$1和$2