하나의 명령으로 상대 경로를 복사할 수 있나요?

하나의 명령으로 상대 경로를 복사할 수 있나요?

나는 이 작업을 너무 자주 수행하기 때문에 이를 수행하는 표준 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 …가능한 경우 이를 사용하십시오.)

또는 이를 쉘 스크립트나 함수로 만들 수 있습니다.

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

관련 정보