可以在一个命令中复制相对路径吗?

可以在一个命令中复制相对路径吗?

我发现自己经常这样做,以至于我想知道是否有标准的 Unix 方法可以做到这一点:

% mkdir -p /TARGETDIR/relative/path/to
% cp ./relative/path/to/somefile /TARGETDIR/relative/path/to

换句话说,我不想只是复制somefile/TARGETDIR,但实际上我想复制它的整个相对路径

有没有比上面两行更简单的方法?

答案1

使用 GNU coreutils(非嵌入式 Linux、Cygwin):

cp -p --parents path/to/somefile /TARGETDIR

使用 POSIX 工具pax(不幸的是,许多 Linux 默认安装都缺乏):

pax -rw -pp relative/path/to/somefile /TARGETDIR

与传统的对应物cpio:

find relative/path/to/somefile | cpio -p -dm /TARGETDIR

(最后一个命令假设文件名不包含换行符;如果攻击者可能选择文件名,请使用其他方法,或者find … -print0 | cpio -0 …在可用的情况下使用。)

或者,您可以将其设为 shell 脚本或函数。

cp_relpath () {
  mkdir -p -- "$2/$(dirname -- "$1")"
  cp -Rp -- "$1" "$2/$(dirname -- "$1")"
}

答案2

man cp揭示--parents。就这么简单,是的。

$ mkdir /tmp/myetc && cp --parents init.d/cron /tmp/myetc && find /tmp/myetc/
/tmp/myetc/
/tmp/myetc/init.d
/tmp/myetc/init.d/cron

相关内容