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

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

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

冉冉说 2019-12-10 10:14:58
我想要创建目标目录(如果不存在)的命令(或cp的选项)。例:cp -? file /path/to/copy/file/to/is/very/deep/there
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

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

()没有此类选项cp。


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

TA贡献1847条经验 获得超7个赞

简短答案

要复制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
  • 3 回答
  • 0 关注
  • 3750 浏览
慕课专栏
更多

添加回答

举报

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