tar를 사용하여 모든 "점 파일"을 포함하지만 모든 하위 디렉터리와 /wo 디렉터리 구조를 제외하는 아카이브를 만듭니다.

tar를 사용하여 모든 "점 파일"을 포함하지만 모든 하위 디렉터리와 /wo 디렉터리 구조를 제외하는 아카이브를 만듭니다.

.zshrc내 홈 디렉터리에 있는 모든 "점 파일"(fe)을 백업하고 싶습니다.아스팔트이지만 디렉터리 구조와 모든 하위 디렉터리는 포함되지 않습니다.

나는 다른 명령으로 몇 번 시도했지만 내가 달성한 최고는 $HOME숨겨진 디렉터리도 포함된 아카이브를 사용한 것이었습니다.

#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*

find또한 결과를 사용하여 tar로 전송하는 것도 고려했지만 성공하지 못했습니다. 간단해 보이는 이 작업을 수행하는 방법을 아는 사람이 있나요?

추신: tar를 사용하여 아카이브를 만들 때 대부분의 경우 xkcd 만화를 고려해야 합니다.

xkcd1168:)

답변1

다음 명령을 사용하여 디렉터리의 모든 도트 파일( .<something>) 을 백업할 수 있습니다 $HOME.

$ cd ~
$ find . -maxdepth 1 -type f -name ".*" -exec tar zcvf dotfiles.tar.gz {} +

tar만 사용하는 정규식?

방법 1

나는 이것에 대해 꽤 많은 연구를 수행했지만 아무것도 발견하지 못했습니다. 제한 요소는 tar제외를 수행할 때 /디렉터리에 표시된 후행 슬래시( )가 tar가 패턴 일치를 수행할 때 방정식의 일부가 아니라는 것입니다.

예는 다음과 같습니다.

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*/'} .*
.qalculate/
.qt/
.qterm/
.qtoctave/
.RapidSVN
.RData
.Rhistory

이 변형에는 tar의 상세 스위치를 켜서 이러한 디렉터리가 통과하는 것을 .*/볼 수 있는 제외 기능이 포함되어 있습니다 .-v

방법 #2

스위치가 사람들의 탐욕을 풀어줄 --no-wildcards-match-slash수도 있겠다고 생각했는데 그것도 효과가 없었어요.--wildcards-match-slash.*/

제외 항목에서 슬래시를 제거하는 것도 .*옵션이 아닙니다. tar모든 도트 파일과 도트 디렉터리를 제외하라고 지시하기 때문입니다.

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --exclude={'.','..','.*'} .*
$

방법 #3 (못생겼어요!)

그래서 제가 생각할 수 있는 유일한 다른 옵션은 다음과 같습니다 tar.

$ tar -v --create --file=do.tar.gz --auto-compress --no-recursion --wildcards-match-slash --exclude={'.','..','.*/'} $(ls -aF | grep -E "^\..*[^/]$")
.RapidSVN
.RData
.Rhistory

이 접근 방식의 문제점은 파일 수가 명령에 인수를 전달하기 위한 최대 공간을 초과하는 경우 눈에 띄게 나타납니다. 또 다른 하나는 추악하고 지나치게 복잡하다는 것입니다.

그래서 우리는 무엇을 배웠나요?

& 정규식을 사용하여 이 작업을 수행 하는 간단하고 우아한 방법은 없는 것 같습니다 tar. @terdon의 의견에 따르면 find ... | tar ...이것이 실제로 더 적절한 접근 방식입니다.

답변2

일치하는 파일에 대한 이러한 종류의 제어는 tar의 안전 영역을 훨씬 벗어납니다. 파일 일치 규칙은 단순한 이름 일치로 제한됩니다.

find한 가지 방법이지만 zsh가 있으므로 더 쉽습니다.

tar -cf "$HOME/$BACKUPFILE" --auto-compress .*(.)

.끝에 괄호 안의 와일드카드 표현식은 다음과 같습니다.글로벌 예선"일반 파일만 일치"라고 나옵니다.

일반 파일에 대한 심볼릭 링크가 일치하지 않습니다. 로 변경하면 .*(-.)포함되지만 파일도 포함되지 않는 한 파일은 아카이브에 남지 않습니다. 심볼릭 링크를 대상으로 바꾸려면 추가 .*(-.:A):A추가역사 확장 수정자기호 링크를 사용하지 않고 경로에 대한 모든 기호 링크를 확인합니다.

답변3

이 답변은 slm을 기반으로 하지만 포함하는 방법도 보여 드리겠습니다..

도트 파일을 홈 디렉터리로 압축하려면 다음을 수행하세요.

$ cd
$ find . -maxdepth 1 -type f -name ".?*" -exec tar czfv dotfiles.tgz {} +

디렉터리를 포함하려면:

$ find . -maxdepth 1 -name ".?*" -exec tar czfv dotfiles.tgz {} +

첫 번째 명령에서는 ?선택 사항 이지만 두 번째 명령에서는 선택 사항이 아닙니다. 그렇지 않으면 (현재) 디렉터리가 find포함됩니다 ..

답변4

무엇에 대해:

tar -C $HOME -cvzf dotfiles.tgz .

관련 정보