`mkdir -p BASE/a/b/c && cp -a -t BASE/a/b/c /a/b/c/d` 的“标准”单命令替代方案?

`mkdir -p BASE/a/b/c && cp -a -t BASE/a/b/c /a/b/c/d` 的“标准”单命令替代方案?

命令顺序

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/dBASE/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。 :(

相关内容