当前位置:  开发笔记 > 编程语言 > 正文

如何让cp命令创建用于将文件复制到目标的任何必要文件夹

如何解决《如何让cp命令创建用于将文件复制到目标的任何必要文件夹》经验,为你挑选了7个好方法。

将文件复制cp到可能存在或不存在cp的文件夹时,如何在必要时创建文件夹?这是我尝试过的:

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory

lhunath.. 249

为了扩展Christian的答案,唯一可行的方法是结合mkdircp:

mkdir -p /foo/bar && cp myfile "$_"

另外,当您只需要在现有层次结构中创建单个目录时,rsync可以在一个操作中执行此操作.事实上,我非常rsync喜欢更多功能的cp替代品:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.

在上面的答案中提到了它,但我想再次强调它(由于没有注意到精细打印而浪费了几分钟):上面的`rsync`命令*不等同于`mkdir/cp`命令以上.它只是创建一个级别的文件夹.实际上我不确定它什么时候有用. (7认同)

`"$ _"`是一个"bash变量" - [LINK FOR MORE INFO](http://www.thegeekstuff.com/2010/05/bash-shell-special-parameters/#comments). (7认同)

另外,对于想知道`mkdir`的`-p`参数的人,它在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html的POSIX标准中有记录,并导致中间路径名组件成为创建(即使你的`mkdir foo/bar/baz`即使`foo`或`bar`还不存在). (6认同)

这个答案是最好的,因为如果您在谷歌搜索之前遇到先前输入的cp命令,您可以轻松地"按住ctrl + a"来查看错误思考的`cp`命令的开头并更正它.谢谢! (4认同)

@PengheGeng:是的,这个rsync命令只能创建一个级别的文件夹,但是rsync可以选择创建所有文件夹,或者只创建一些文件夹.[rsync:如何配置它以在服务器上创建目标目录?](/sf/ask/17360801/) (3认同)


Christian.. 104

我不知道你能用cp做到这一点.

你可以用mkdir来做..

mkdir -p /var/path/to/your/dir

编辑 请参阅lhunath 关于合并cp 的答案.



1> lhunath..:

为了扩展Christian的答案,唯一可行的方法是结合mkdircp:

mkdir -p /foo/bar && cp myfile "$_"

另外,当您只需要在现有层次结构中创建单个目录时,rsync可以在一个操作中执行此操作.事实上,我非常rsync喜欢更多功能的cp替代品:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.


在上面的答案中提到了它,但我想再次强调它(由于没有注意到精细打印而浪费了几分钟):上面的`rsync`命令*不等同于`mkdir/cp`命令以上.它只是创建一个级别的文件夹.实际上我不确定它什么时候有用.
`"$ _"`是一个"bash变量" - [LINK FOR MORE INFO](http://www.thegeekstuff.com/2010/05/bash-shell-special-parameters/#comments).
另外,对于想知道`mkdir`的`-p`参数的人,它在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/mkdir.html的POSIX标准中有记录,并导致中间路径名组件成为创建(即使你的`mkdir foo/bar/baz`即使`foo`或`bar`还不存在).
这个答案是最好的,因为如果您在谷歌搜索之前遇到先前输入的cp命令,您可以轻松地"按住ctrl + a"来查看错误思考的`cp`命令的开头并更正它.谢谢!
@PengheGeng:是的,这个rsync命令只能创建一个级别的文件夹,但是rsync可以选择创建所有文件夹,或者只创建一些文件夹.[rsync:如何配置它以在服务器上创建目标目录?](/sf/ask/17360801/)

2> Christian..:

我不知道你能用cp做到这一点.

你可以用mkdir来做..

mkdir -p /var/path/to/your/dir

编辑 请参阅lhunath 关于合并cp 的答案.


cp(1)没有.mkdir -p/foo/bar && cp myfile"$ _"确实是可靠地执行此操作的唯一方法.
lhunath的评论是最正确和完整的答案

3> eythort..:

对于那些使用Mac OSX的人来说,解决这个问题的最简单方法可能是使用ditto(仅限于mac,AFAIK).它将创建目标中缺少的目录结构.

例如,我这样做了

ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/

~/work运行命令之前,哪里没有包含二进制目录.

我认为rsync应该工作类似,但它似乎只适用于一个级别的丢失目录.那是,

rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/

工作,因为〜/ work/binaries/macosx存在但不是〜/ work/binaries/macosx/6.3.2 /



4> Jamie McCrin..:
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt



5> victor hugo..:

没有这样的选择.你可以做的是在复制文件之前运行mkdir -p

我制作了一个非常酷的脚本,您可以用它来复制不存在的位置的文件

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

现在只需保存它,赋予它权限并使用它运行它

./cp-improved SOURCE DEST

我把-R选项,但它只是一个草稿,我知道它可以,你会在很多方面改进它.希望它能帮到你


如果有人在处理时尝试重命名文件,那将导致奇怪的结果:`cp-improved /foo/file.jpg/bar/file.jpg.bak`.无论是否存在"bar",我都会以`/ bar/file.jpg.bak/file.jpg`结束
请引用你的参数扩展.或者你会遇到由wordplitting和pathname扩展引入的bug.在你所有的$ foo周围加上"".

6> 小智..:

也可以使用命令find:

find ./ -depth -print | cpio -pvd newdirpathname



7> Chu-Siang La..:

rsync是有效的!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有