나는 이 작업을 너무 자주 수행하기 때문에 이를 수행하는 표준 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