.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 만화를 고려해야 합니다.
:)
답변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 .