도트 파일이 포함된 디렉토리를 압축하지만 디렉토리 자체에 대한 모든 참조를 무시하는 방법

도트 파일이 포함된 디렉토리를 압축하지만 디렉토리 자체에 대한 모든 참조를 무시하는 방법

일반적인 도트 파일 배열을 포함하여 홈 디렉터리를 백업하고 싶지만 백업에서 디렉터리 자체나 해당 권한이 언급되는 것을 원하지 않습니다. 그래서 내가 이런 구조를 가지고 있다면

homedir
    .dotfile
    somesubdir
        subfile
    outerfile

나는 다음과 같은 타르를 원합니다:

.dotfile
somesubdir
    subfile
outerfile

homedir에 대한 참조는 없으며 심지어 ./도 없습니다.

실제로 해결책(아래 게시글)이 있는데, 생각난 질문에 첨부하려고 했더니 몇몇 진행자들이 자체 질문이 필요하다고 하더라구요. 그게 다입니다. 유용하길 바랍니다.

답변1

다음의 상위 디렉토리에 있다고 가정합니다 homedir.

tar -c -f homedir.tar -C homedir .

이렇게 하면 와 관련하여 tar치료 가 고려 됩니다 . 이 옵션은 기본적으로 주어진 디렉토리에 들어가는 것과 같은 역할을 합니다 . 파일과 디렉토리는 경로 접두어가 붙은 아카이브에 저장됩니다 . .homedir-Ccd./

./경로 접두사를 제거하려면 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로 리디렉션할 때 디렉터리 변경 사항은 언급되지 않습니다.

관련 정보