我需要一个命令(可能是cp的一个选项)来创建目标目录(如果目标目录不存在)。
例子:
cp -? file /path/to/copy/file/to/is/very/deep/there
我需要一个命令(可能是cp的一个选项)来创建目标目录(如果目标目录不存在)。
例子:
cp -? file /path/to/copy/file/to/is/very/deep/there
当前回答
简单的
cp -a * /path/to/dst/
应该能行。
其他回答
如果以下两个条件都成立:
您使用的是GNU版本的cp(而不是Mac版本),并且 您正在从一些现有的目录结构进行复制,您只需要重新创建它
然后你可以用cp的——parents标志来做。从信息页面(可以在http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocation或info cp或man cp查看):
——父母 通过追加到目标文件来形成每个目标文件的名称 目录中包含斜杠和源文件的指定名称。的 给' cp'的最后一个参数必须是现有的 目录中。例如,命令: Cp——parents a/b/c existing_dir 复制文件' a/b/c'到' existing_dir/a/b/c',创建any 缺少中间目录。
例子:
/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
只是恢复和给出一个完整的工作解决方案,在一行。 如果您想要重命名文件,请注意,您应该包括一种方法来提供到mkdir的干净dir路径。$fdst可以是file或dir。 下一段代码在任何情况下都可以工作。
fsrc=/tmp/myfile.unk
fdst=/tmp/dir1/dir2/dir3/myfile.txt
mkdir -p $(dirname ${fdst}) && cp -p ${fsrc} ${fdst}
或者特定于bash
fsrc=/tmp/myfile.unk
fdst=/tmp/dir1/dir2/dir3/myfile.txt
mkdir -p ${fdst%/*} && cp -p ${fsrc} ${fdst}
这里有一种方法:
mkdir -p `dirname /path/to/copy/file/to/is/very/deep/there` \
&& cp -r file /path/to/copy/file/to/is/very/deep/there
Dirname将为您提供目标目录或文件的父目录。Mkdir -p ' dirname…'将创建该目录,确保当您调用cp -r时,正确的基目录已经就位。
这相对于——parents的优点是,它适用于目标路径中的最后一个元素是文件名的情况。
它可以在OS X上运行。
简短的回答
复制myfile.txt到/foo/bar/myfile.txt,使用:
mkdir -p /foo/bar && cp myfile.txt $_
这是如何工作的呢?
这里有几个组件,所以我将一步一步地介绍所有语法。
POSIX标准中指定的mkdir实用程序创建目录。根据文档,-p参数将导致mkdir
创建任何缺少的中间路径名组件
这意味着当调用mkdir -p /foo/bar时,如果/foo不存在,mkdir将创建/foo和/foo/bar。(如果没有-p,它将抛出一个错误。
&&列表操作符,如POSIX标准(或Bash手册,如果你喜欢)中所述,其效果是只有在mkdir -p /foo/bar成功执行时才执行cp myfile.txt $_。这意味着如果mkdir失败,cp命令将不会尝试执行,原因有很多。
最后,我们传递给cp的第二个参数$_是一个“特殊参数”,可以方便地避免重复长参数(如文件路径),而不必将它们存储在变量中。根据Bash手册,它:
展开到上一个命令的最后一个参数
在本例中,这是我们传递给mkdir的/foo/bar。因此cp命令展开为cp myfile.txt /foo/bar,将myfile.txt复制到新创建的/foo/bar目录中。
注意$_不是POSIX标准的一部分,所以理论上Unix变体可能有一个不支持这个构造的shell。然而,我不知道任何现代shell不支持$_;当然Bash, Dash和zsh都喜欢。
最后注意:我在回答开头给出的命令假设目录名中没有空格。如果你正在处理带有空格的名称,你需要引用它们,这样不同的单词就不会被视为mkdir或cp的不同参数。所以你的命令实际上是这样的:
mkdir -p "/my directory/name with/spaces" && cp "my filename with spaces.txt" "$_"
Oneliner创建一个小脚本,可以用作子命令,在find例如:
组+ H;Echo -e "#!/bin/sh\nmkdir -p \$(dirname \"\$2\");Cp \"$ 1\" \"$2\"\;"> ~ /地方/ bin / cpmkdir;Chmod +x ~/local/bin/cpmkdir . sh
然后你可以这样使用它:
查找name files_you_re_lookin_for。* -exec cpmkdir {} ./ extracted_copy / {} \;