我发现自己经常这样做,以至于我想知道是否有标准的 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