命令顺序
mkdir -p BASE/a/b/c && cp -a --target-directory=BASE/a/b/c /a/b/c/d
a/b/c
在 下创建一个子目录BASE
,然后将目录树复制到/a/b/c/d
到BASE/a/b/c
。
它的一个问题是它需要大量重复,从而导致错误。
我可以推出一个外壳函数来封装这个操作;例如,这是一个没有任何错误检查/处理的草图:
copytwig () {
local source=$1
local base=$2
local target=$base/$( dirname $source )
mkdir -p $target && cp -a --target-directory=$target $source
}
...但是我想知道这是否可以通过“标准”Unix实用程序来完成(我使用“标准”作为“可能在Unix系统中找到,或者至少可能在Linux 系统”)。
答案1
使用 pax
(强制 POSIX 实用程序,但在某些 GNU/Linux 发行版中尚未默认安装):
pax -s':^:BASE/:' -pe -rw /a/b/c/d .
(请注意, 和--target-directory
都不-a
是标准cp
选项。这些是 GNU 扩展)。
请注意,使用-pe
(类似于 GNU 的-a
),pax
也会尝试复制目录组件的元数据(时间、所有者、权限...)(而BASE
的元数据将如同使用 创建一样mkdir BASE
)。
答案2
您可以使用--parents
开关 forcp
来保留目录结构。
mkdir BASE && cp --parents -a --target-directory=BASE /a/b/c/d
编辑:抱歉,您要求的是 Unix 解决方案,但这似乎仅限于 Linux。 :(