为了账号安全,请及时绑定邮箱和手机立即绑定

Linux:复制并创建目标目录(如果不存在)

/ 猿问

Linux:复制并创建目标目录(如果不存在)

冉冉说 2019-12-10 10:14:58

我想要创建目标目录(如果不存在)的命令(或cp的选项)。


例:


cp -? file /path/to/copy/file/to/is/very/deep/there


查看完整描述

3 回答

?
qq_花开花谢_0

mkdir -p "$d" && cp file "$d"

()没有此类选项cp。


查看完整回答
反对 回复 2019-12-10
?
忽然笑

如果以下两个条件都成立:


您使用的是GNU版本cp(而不是Mac版本),并且

您正在从一些现有的目录结构中复制,只需要重新创建它

那么您可以使用--parents标记来执行此操作cp。从信息页面(可视范围在http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation或info cp或man cp):


--parents

     Form the name of each destination file by appending to the target

     directory a slash and the specified name of the source file.  The

     last argument given to `cp' must be the name of an existing

     directory.  For example, the command:


          cp --parents a/b/c existing_dir


     copies the file `a/b/c' to `existing_dir/a/b/c', creating any

     missing intermediate directories.

例:


/tmp $ mkdir foo

/tmp $ mkdir foo/foo

/tmp $ touch foo/foo/foo.txt

/tmp $ mkdir bar

/tmp $ cp --parents foo/foo/foo.txt bar

/tmp $ ls bar/foo/foo

foo.txt


查看完整回答
反对 回复 2019-12-10
?
aluckdog

简短答案

要复制myfile.txt到/foo/bar/myfile.txt,请使用:


mkdir -p /foo/bar && cp myfile.txt $_

这是如何运作的?

这有几个组成部分,因此我将逐步介绍所有语法。


POSIX标准中指定的mkdir实用程序创建目录。的说法,每文档,会造成MKDIR到-p


创建任何缺少的中间路径名组件


意味着在调用时mkdir -p /foo/bar,mkdir将创建/foo , /foo/bar如果/foo尚不存在。(如果没有-p,它将抛出错误。


如POSIX标准(或Bash手册,如果您愿意)&&中所述,列表运算符的作用是只有成功执行后才能执行。这意味着如果由于失败的多种原因之一而失败,该命令将不会执行。cp myfile.txt $_mkdir -p /foo/barcpmkdir


最后,$_作为第二个参数传递的cp是“特殊参数”,它可以避免重复长参数(如文件路径)而不必将其存储在变量中。根据Bash手册,它:


扩展到上一个命令的最后一个参数


在这种情况下,这就是/foo/bar我们传递给的mkdir。因此,cp命令将扩展为cp myfile.txt /foo/bar,将复制myfile.txt到新创建的/foo/bar目录中。


请注意,$_是不是 POSIX标准的一部分,所以理论上Unix的变种可能具有不支持此构建物的外壳。但是,我不知道任何不支持的现代外壳$_;当然Bash,Dash和zsh都可以。


最后一点:在此答案开头给出的命令假定您的目录名称中没有空格。如果要处理带有空格的名称,则需要用引号将它们引起来,不会被视为mkdir或的不同参数cp。因此,您的命令实际上如下所示:


mkdir -p "/my directory/name with/spaces" && cp "my filename with spaces.txt" "$_"


查看完整回答
反对 回复 2019-12-10

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信