모든 'dotfiles'를 포함하지만 모든 서브 디렉토리 및 / wo 디렉토리 구조를 제외하고 tar를 사용하여 아카이브 작성


18

tar로.zshrc 홈 디렉토리 아래의 모든 'dotfiles'(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를 사용하여 아카이브를 만들 때 대부분 xkcd comic에 대해 생각해야합니다.

xkcd 1168 :)


sim 의 답은 효과가 있지만 누군가 숨겨진 파일 만 일치하는 정규 표현식을 얻은 경우 게시하십시오!
klingt.net

1
분명히 이것은 쉘로 더 잘 달성 될 것입니다. 그 zsh을 파일 만 선택 globs의를 가지고 이해 - *(.)- 나는 그것을 제외 생각 ...에서 .*기본적으로 (그들이에 의해 선택되지 않을 것이다 .*(.)그것은 단지 파일을 선택하기 때문에, 어쨌든). zsh를 직접 사용하지 않으므로 이것을 대답으로 바꿀만큼 확실하지 않습니다.
evilsoup

답변:


14

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

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

그냥 타르를 사용하는 정규식?

방법 # 1

나는 이것을 꽤 연구하고 비어있었습니다. 제한 요소는 tar제외를 수행 할 /때 tar가 패턴 일치를 수행 할 때 디렉토리와 함께 나타나는 후행 슬래시 ( )가 방정식의 일부가 아니라는 것입니다.

예를 들면 다음과 같습니다.

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

이 변형에는 제외가 포함되어 있으며 .*/verbose 스위치를 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 ...작업을 수행하는 가장 적합한 방법입니다.


나는 정말로 그것을 끝내고 싶었지만 regex, 그것이 그렇게 작동하지 않는다는 것을 알아야했다 :)
klingt.net

@ klingt.net-가능해야합니다. 지금 찾고 있습니다.
slm

@ klingt.net 왜 더 복잡한 방법을 선호합니까? 사용 regex하면 것은 아마도 선행 점을 탈출하고 문제를 무시해야합니다 필요합니다 .... 나는 slm이 아마도 증명할 것이 가능하지만 그것이 왜 가치가 있는지는 알지 못한다.
terdon

1
@ klingt.net- find명령이 찾은 모든 것이 인수로 전달됩니다 tar. 는 {}당신이 그 결과를 해당에 가고 싶은 곳 말합니다 -exec명령. 이 명령은 명령 줄에 맞는만큼의 +결과를 추가 하고 결과를 찾을 때마다 두 번만 find호출 한다고 말합니다 tar.
slm

1
@ klingt.net는 - 사용하여이 작업을 수행 할 수있는 방법이없는 regextar(도트 디렉토리를 분리 할 수있는 방법이 없기 때문에 .blah/). Tar는 제외를 수행 할 때 후행 슬래시를 사용하지 않습니다.
slm

4

일치하는 파일에 대한 이러한 종류의 제어는 타르의 안락 지대를 벗어납니다. 파일 일치 규칙은 이름에 대한 단순 일치로 제한됩니다.

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인클루드합니다 .(현재) 디렉토리.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.