일반적인 도트 파일 배열을 포함하여 홈 디렉터리를 백업하고 싶지만 백업에서 디렉터리 자체나 해당 권한이 언급되는 것을 원하지 않습니다. 그래서 내가 이런 구조를 가지고 있다면
homedir
.dotfile
somesubdir
subfile
outerfile
나는 다음과 같은 타르를 원합니다:
.dotfile
somesubdir
subfile
outerfile
homedir에 대한 참조는 없으며 심지어 ./도 없습니다.
실제로 해결책(아래 게시글)이 있는데, 생각난 질문에 첨부하려고 했더니 몇몇 진행자들이 자체 질문이 필요하다고 하더라구요. 그게 다입니다. 유용하길 바랍니다.
답변1
다음의 상위 디렉토리에 있다고 가정합니다 homedir
.
tar -c -f homedir.tar -C homedir .
이렇게 하면 와 관련하여 tar
치료 가 고려 됩니다 . 이 옵션은 기본적으로 주어진 디렉토리에 들어가는 것과 같은 역할을 합니다 . 파일과 디렉토리는 경로 접두어가 붙은 아카이브에 저장됩니다 . .
homedir
-C
cd
./
./
경로 접두사를 제거하려면 BSD를 사용하십시오 tar
.
tar -c -f homedir.tar -C homedir -s '/^\.\//' .
또는 GNU를 사용하여 tar
,
tar -c -f homedir.tar -C homedir --transform 's/^\.\//' .
답변2
Bash 4.4.19 및 GNU tar 1.29를 사용하면 다음을 수행할 수 있습니다. 'dotglob'을 사용하면 *는 점과 문자를 인식할 수 있는 반면 'GLOBIGNORE'는 "."를 무시하도록 설정됩니다. 그리고"..". 중괄호를 사용하면 출력을 현재 디렉터리로 보낼 수 있으며, pushd 및 popd를 사용하면 콘텐츠가 있는 위치에서 tar가 발생하게 됩니다. 저는 tar의 -C 옵션을 사용하지 않습니다. 왜냐하면 "*" 전역을 엉망으로 만들기 때문입니다.
shopt -s dotglob
GLOBIGNORE=".:.."
{
pushd homedir >/dev/null
tar --create --file=- *
popd >/dev/null
} >inner.tar
shopt -u dotglob
출력 파일이 "-"로 설정되어 있다는 점에 유의하십시오. 이는 표준 출력이 결국 inner.tar 파일로 이동함을 의미합니다. /dev/null로 리디렉션할 때 디렉터리 변경 사항은 언급되지 않습니다.