如何同时复制文件并创建目标目录?


20

我想cp aaa/deep/sea/blob.psd,以bbb/deep/sea/blob.psd

如果deepsea目录下不存在bbb该如何复制,以便该副本创建所需的目录并复制该文件?

现在,我变得
No such file or directory更深,海洋不存在。

我翻阅了帮助页面和其他问题,但没有发现任何问题。

我最接近的rcp用于目录:

rcp -r aaa/deep/sea/ bbb/deep/sea/

虽然这会复制整个目录和内容,但我只想要一个文件。尝试这样做但是给了cp: cannot create regular file bbb/deep/sea/blob.psd' such file or directory

Answers:


19

在这种情况下,尝试使用以下功能:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }

并用作

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd

顺便说一下,GNU cp有一个--parents选择。它确实接近您想要的,但不完全相同。
它还将创建aaa似乎不需要的目录。但是,您可以先将cd aaa复制并复制为:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/

24

使用coreutils中的install程序很容易,该程序通常由诸如automake之类的构建系统用于此目的:

install -D /path/to/source /path/to/destination

请注意,就像install创建路径一样,请创建路径的所有部分。我很好奇您为什么不包括为什么要这样做。调用和非常容易。mkdir -pman installmkdircp


2
我认为在这个问题上有很多好的答案,但是由于它是最易移植的,因此得到了我的投票。的rsync回答只会造成1个目录,pax似乎不很常见。
帕特里克

使用-d而不是-D在Mac上。
马特M.16年

请注意,此命令使用755rwxr-xr-x)权限创建目标文件,这可能是不希望的。你可以指定与别的-m开关,但我无法找到一种方法,只保留文件的权限:(
törzsmókus

6

使用标准(POSIX / Unix)命令,您将:

pax -rws ':^:dest/dir/:' file .

1
有趣。我以前从未听说过pax。虽然我喜欢它的概念。不幸的是,即使它在POSIX中,默认情况下似乎也很少发行版安装它:-(
Patrick

@Patrick-如果您一直跳过到最后info tar- 可移植性问题部分的某个地方-我想您会发现GNU tar声称是完全pax兼容的。无论如何我都做了,尽管我还没有绕过那些说法。
mikeserv

5

我不知道使用的方式,但是使用cp可以实现rsync

$ rsync sourcefile dir/

哪里dir是一个不存在的目录。还有许多其他方法可以使用其他命令来实现相同目的。


3
您需要rsync -R保留目录层次结构
glenn jackman 2014年

@glennjackman确实,“正确”使用rsync需要更多选项,但问题只是关于创建不存在的目标目录,因此,我的简短回答是:)
mjturner 2014年

1
至少GNU cp可以--parents选择。
彼得2014年

2
@peterph的确如此,但是您在目标目录的命名上受到了限制
mjturner 2014年

4
cd aaa
pax -rw deep/sea/blob.psd ../bbb

如果没有pax(POSIX强制要求,它作为cpio和tar的标准替代品,它们有太多不兼容的地方无法标准化),请使用cpio -ptar -cf - … | tar -xf -代替。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.