Com o GNU coreutils (Linux não integrado, Cygwin):
cp -p --parents path/to/somefile /TARGETDIR
Com a ferramenta POSIX pax
(que infelizmente faltam muitas instalações padrão do Linux) :
pax -rw -pp relative/path/to/somefile /TARGETDIR
Com sua contraparte tradicional cpio
:
find relative/path/to/somefile | cpio -p -dm /TARGETDIR
(Este último comando assume que os nomes dos arquivos não contêm novas linhas; se os nomes dos arquivos puderem ser escolhidos por um invasor, use outro método ou use find … -print0 | cpio -0 …
, se disponível.)
Como alternativa, você pode criar um script ou função de shell.
cp_relpath () {
mkdir -p -- "$2/$(dirname -- "$1")"
cp -Rp -- "$1" "$2/$(dirname -- "$1")"
}