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

Mic*_*ant 20 directory file-copy

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

如果deepsea目录不存在,我该如何进行复制,bbb以便复制既创建所需的目录又复制文件?

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

我查看了 man 帮助页面和其他问题,但没有任何反应。

我最接近的是rcp用于目录:

rcp -r aaa/deep/sea/ bbb/deep/sea/
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*rda 24

使用coreutils中的install程序很容易,该程序通常由像automake这样的构建系统用于此目的:

install -D /path/to/source /path/to/destination
Run Code Online (Sandbox Code Playgroud)

请注意,就像install创建路径的所有部分一样mkdir -p,请参阅man install。我很好奇你为什么不包括你为什么要这样做。打电话mkdircp很容易。

  • 我认为在这个问题上有很多很好的答案,但是这个问题得到了我的投票,因为它是最便携的。`rsync` 答案只会创建 1 个目录,而 `pax` 似乎并不常见。 (2认同)

rus*_*ush 19

尝试在这种情况下使用这样的 next 函数:

copy_wdir() { mkdir -p -- "$(dirname -- "$2")" && cp -- "$1" "$2" ; }
Run Code Online (Sandbox Code Playgroud)

并将其用作

copy_wdir aaa/deep/sea/blob.psd bbb/deep/sea/blob.psd
Run Code Online (Sandbox Code Playgroud)

顺便说一下,GNUcp有一个--parents选项。它真的很接近你想要的,但不完全是。
它还将创建aaa您似乎不需要的目录。但是,您可以先 cd 到aaa并复制如下:

cd aaa && cp --parents deep/sea/blob.psd ../bbb/
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 6

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

pax -rws ':^:dest/dir/:' file .
Run Code Online (Sandbox Code Playgroud)


mjt*_*ner 5

我不知道使用 的方法cp,但肯定可以使用rsync

$ rsync sourcefile dir/
Run Code Online (Sandbox Code Playgroud)

wheredir是一个不必存在的目录。使用其他命令还有很多其他方法可以实现相同的目标。

  • 您需要 `rsync -R` 来保留目录层次结构 (3认同)
  • @peterph 确实如此,但是您在目标目录的命名方面受到限制 (2认同)