可以在一个命令中复制 relpath 吗?

kjo*_*kjo 3 command-line directory cp files

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

% mkdir -p /TARGETDIR/relative/path/to
% cp ./relative/path/to/somefile /TARGETDIR/relative/path/to
Run Code Online (Sandbox Code Playgroud)

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

有没有比上面的两行更简单的方法来做到这一点?

Gil*_*il' 6

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

cp -p --parents path/to/somefile /TARGETDIR
Run Code Online (Sandbox Code Playgroud)

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

pax -rw -pp relative/path/to/somefile /TARGETDIR
Run Code Online (Sandbox Code Playgroud)

与其传统对应物cpio

find relative/path/to/somefile | cpio -p -dm /TARGETDIR
Run Code Online (Sandbox Code Playgroud)

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

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

cp_relpath () {
  mkdir -p -- "$2/$(dirname -- "$1")"
  cp -Rp -- "$1" "$2/$(dirname -- "$1")"
}
Run Code Online (Sandbox Code Playgroud)