Pode-se copiar um relpath em um comando?

2

Eu me vejo fazendo isso com frequência suficiente para me perguntar se existe uma maneira padrão do Unix de fazer isso:

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

Em outras palavras, não quero copiar apenas somefile para /TARGETDIR , mas, na verdade, quero copiar todo o caminho relativo .

Existe uma maneira mais simples de fazer isso do que o de duas linhas acima?

    
por kjo 05.03.2013 / 21:12

2 respostas

6

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")"
}
    
por 06.03.2013 / 00:29
3

man cp revela --parents . Tão simples, sim.

$ mkdir /tmp/myetc && cp --parents init.d/cron /tmp/myetc && find /tmp/myetc/
/tmp/myetc/
/tmp/myetc/init.d
/tmp/myetc/init.d/cron
    
por 05.03.2013 / 21:25