tar : .svn 등을 포함하여 현재 디렉토리에있는 모든 파일과 디렉토리를 추가합니다.


89

tar.gz 디렉토리를 사용하고

tar -czf workspace.tar.gz *

결과 tar는 .svn현재 디렉토리가 아닌 하위 디렉토리에있는 디렉토리를 포함 *합니다 (tar로 전달되기 전에 '보이는'파일로만 확장 됨).

나는 노력했다

tar -czf workspace.tar.gz .대신 '.'때문에 오류가 발생합니다. 읽는 동안 변경되었습니다.

tar: ./workspace.tar.gz: file changed as we read it

*디렉토리의 모든 파일 (점 접두사 포함)과 일치 하는 트릭이 있습니까?

(Linux SLES-11 (2.6.27.19)에서 bash 사용)


5
이 질문이 수퍼 유저에게 속할까요?
Peter Jaric

답변:


75

압축하려는 디렉토리에 tar 파일을 만들지 마십시오.

tar -czf /tmp/workspace.tar.gz .

압축을 풀 때 현재 디렉토리 전체에서 파일을 추출한다는 점을 제외하면 트릭을 수행합니다. 더 나은 방법 :

cd ..
tar -czf workspace.tar.gz workspace

또는 자신이 속한 디렉토리의 이름을 모르는 경우 :

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(이것은 사용자가 현재 위치에 도달하기 위해 심볼릭 링크를 따르지 않았고 셸이 심볼릭 링크를 통해 뒤로 점프하여 두 번째 추측을 시도하지 않는다고 가정합니다 bash.이 점에서 신뢰할 수 없습니다. 걱정해야하는 경우, cd -P ..물리적 변경 디렉토리를 수행하는 데 사용 합니다. 내 견해로는 기본 동작이 아니라는 것이 어리 석습니다. 적어도 cd ..대체 의미가 없었던 사람들에게는 혼란 스럽 습니다.)


토론의 한 의견은 다음과 같습니다.

나는 [...] 최상위 디렉토리를 제외하고 [...] 기본 디렉토리에 tar를 배치해야합니다.

주석의 첫 부분은별로 의미가 없습니다. tar 파일에 현재 디렉토리가 포함되어 있으면 해당 아카이브에서 파일을 추출 할 때 생성되지 않습니다. 정의에 따라 현재 디렉토리가 이미 존재하기 때문입니다 (매우 이상한 상황 제외). ).

주석의 두 번째 부분은 다음 두 가지 방법 중 하나로 처리 할 수 ​​있습니다.

  1. 또는 /tmp가능한 위치 중 하나 인 다른 위치에 파일을 만든 다음 완료되면 원래 위치로 다시 이동합니다.
  2. 또는 : GNU Tar를 사용하는 경우 --exclude=workspace.tar.gz옵션을 사용하십시오 . 뒤의 문자열 =은 패턴입니다. 예는 가장 단순한 패턴입니다. 정확히 일치합니다. --exclude=./workspace.tar.gz권장 사항과 달리 현재 디렉토리에서 작업 중인지 지정해야 할 수 있습니다 . --exclude=workspace/workspace.tar.gz제안 된대로 한 수준 위로 작업 중인지 지정해야 할 수 있습니다 . 제외 할 tar 파일이 여러 개인 경우 *에서와 같이 ' '를 사용 --exclude=./*.gz합니다.

1
좋은 대답이지만 압축해야하는 디렉토리 내에서이 명령을 실행해야하는 상황이 있습니다. 외부에서 실행할 권한이 충분하지 않습니다.
Hexodus 2014-06-09

포장하기에 완벽한 장소는 확실히 / tmp입니다.
Andre Fellows

45

당신이 경우 정말 타르의 최상위 디렉토리를 포함하지 않는 (그것은 좋은 생각이 일반적이다) :

tar czf workspace.tar.gz -C /path/to/workspace .

최상위 디렉토리를 제외하고 tar를 기본 디렉토리에 배치해야합니다.
Micha

@Micha는 아카이브에 bash는 스크립트를 만들고 후 파일을 복사
Fedir RYKHTIK

2
당신은 -czf에서-를 놓치고 있다고 생각합니다.
UpTheCreek

10
man tar : tar에 대한 첫 번째 인수는 함수 여야합니다. 문자 중 하나 Acdrtux또는 긴 함수 이름 중 하나. 기능 문자는 접두사로 붙일 필요가 없으며- 다른 단일 문자 옵션과 결합 될 수 있습니다.
rkhayrov 2014 년

4
여전히 작동하지 않습니다. "." 내 타르볼의 최상위 디렉토리로
A. Gille

43

취해야 할 몇 가지 단계가 있습니다.

  1. 교체 *에 의해 .뿐만 아니라 숨겨진 파일을 포함하는.
  2. 동일한 디렉토리에 아카이브를 생성하려면 a --exclude=workspace.tar.gz를 사용하여 아카이브 자체를 제외 할 수 있습니다.
  3. 방지하려면이 tar: .: file changed as we read it아카이브가 아직 생성되지 않은 경우 오류가 있는지가 (예를 들어, 사용하여 존재하게 touch) 너무 --exclude 아카이브 파일 이름과 일치. (파일이 존재하지 않는 것과 일치하지 않습니다)

이를 결합하면 다음 스크립트가 생성됩니다.

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

7
나는 모든 답변과 의견을 읽었으며 이것은 동일한 디렉토리에 tarball을 만드는 가장 좋은 방법입니다. 이 답변에서 나는 왜이 오류가 발생하는지 이해했습니다.
Szymon Sadło

tar 파일을 압축하는 동안 진행 상황을 보려면 다음 --verbose과 같이에 대한 추가 플래그를 추가 할 수 있습니다 -czvf.
Mastrianni

18

압축하려는 디렉토리 (현재 디렉토리)에서 다음을 시도하십시오.

tar -czf workspace.tar.gz . --exclude=./*.gz

2
하지만 지금은 파일 "." 읽는 동안 변경되었습니다. 모든 파일이 포함되었는지 확인할 수 있습니까?
Jaan

1
이것은 .gz디렉토리의 모든 파일을 제외합니다 .
omerfarukdogan

12

디렉토리로 돌아가서 다음을 수행하여 숨겨진 디렉토리를 포함 할 수 있습니다.

cd ..
tar czf workspace.tar.gz workspace

gzip하려는 디렉토리를 작업 공간이라고 가정합니다.


그리고 이것은 파일 변경 문제도 피할 수 있습니다.
Jonathan Leffler

사용자가 상위 폴더에 쓰기 권한이없는 경우 작동하지 않습니다.
Joachim Wagner

정확히 @JoachimWagner!
p01ymath

1
@JoachimWagner. 쓰기 권한이없는 경우 다음과 같이 변경하십시오.tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
bramp

1
나는 그것을 작동시키기 -전에 먼저 꺼내야했다 czf. 그렇지 않으면 Cannot stat: No such file or directory오류 메시지가 나타납니다.
Phemelo Khetho

6

다음 .을 사용하여 양식을 수정할 수 있습니다 --exclude.

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

5

업데이트 : OP의 의견에 대한 수정 사항을 추가했습니다.

tar -czf workspace.tar.gz .

실제로 현재 디렉토리를 변경하지만 파일을 다른 곳에 두지 않는 이유는 무엇입니까?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update

이 추악한 조금 입찰이지만 단지 (모든 일 인도 표준시를 단지 해결 방법을 ...) 필요 -이 파일은 나중에 처리되고 작업 공간에있을 필요
미샤

좋아요, 수정 사항을 추가하겠습니다 :)
Peter Jaric

그리고 이것을 반복적으로 실행할 수 있어야한다면 tar 줄 앞에 'rm workspace.tar.gz'를 추가하세요.
Peter Jaric

전체 드라이브 를 동일한 드라이브 tar하려는 경우 옵션이 많지 않은 것 같습니다.
BeeOnRope

4

실제로 문제는 압축 옵션에 있습니다. 트릭은 내장 옵션을 사용하는 대신 tar 결과를 압축기로 파이프하는 것입니다. 덧붙여서 추가 압축 옵션을 설정할 수 있기 때문에 더 나은 압축을 제공 할 수 있습니다.

최소 타르 :

tar --exclude=*.tar* -cf workspace.tar .

원하는 압축기에 배관하십시오. 이 예제는 상세하며 최대 압축으로 xz를 사용합니다.

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

솔루션은 Ubuntu 14.04 및 Windows 7의 Cygwin에서 테스트되었습니다. 커뮤니티 위키 답변이므로 실수를 발견하면 자유롭게 편집하십시오.


감사합니다! 저장된 엄마의 삶
스티븐

2

여기에 제공된 대부분의 솔루션의 문제점 ./은 모든 항목의 구걸시 tar가 포함되어 있다는 것입니다. 따라서 .GUI 압축기를 통해 열 때 디렉토리가 생깁니다. 그래서 내가 한 일은 다음과 같습니다.

ls -1A | xargs -d "\n" tar cfz my.tar.gz

이미 my.tar.gz현재 디렉토리에 있다면 이것을 grep하는 것이 좋습니다.

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

알고 있어야 그 xargs를하는 것은 특정 한도 (참조있다 xargs --show-limits). 따라서 tar하려는 디렉토리에 많은 항목 (디렉토리 및 파일)이있는 패키지를 만들려는 경우이 솔루션이 작동하지 않습니다.


1

좋은 질문입니다. ZSH에서는 (D)"dotfiles"를 나타내는 globbing modifier를 사용할 수 있습니다 . 비교:

ls $HOME/*

ls $HOME/*(D)

이렇게하면 특수 디렉토리 항목 .... Bash에서는 .*도트 파일을 명시 적으로 포함하는 데 사용할 수 있습니다 .

ls $HOME/* $HOME/.*

그러나 여기에는 ...도 포함 되므로 찾고 있던 것이 아닙니다. *bash에서도 일치하는 dotfile 을 만드는 방법이 있다고 확신 합니다.


bash에서를 사용 .??*하여 .... 단일 문자 도트 파일 (예 :)을 얻지 못합니다 .a. 그것들도 얻으려면 더 복잡한 .[^.]*.
Scott Minster

1

폴더의 항목 수가 많지 않다고 가정하는 또 다른 솔루션 :

tar -czf workspace.tar.gz `ls -A`

( ls -A일반 및 숨김 파일은 인쇄하지만 "."및 ".."는 인쇄 ls -a하지 않습니다.)


0
tar -czf workspace.tar.gz .??* *

지정 .??*하면 점 뒤에 2 자 이상이있는 "점"파일 및 디렉토리가 포함됩니다. 단점은 점 뒤에 단일 문자가있는 파일 / 디렉토리 (예 :있는 .a경우)를 포함하지 않는다는 것입니다.


0

디스크 공간 공간이 문제가되지 않는다면 다음과 같이 매우 쉽게 할 수 있습니다.

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup

0

나도 비슷한 상황을 겪었다. 다른 곳에서 tar를 만든 다음 -C를 사용하여 tar에 압축 파일의 기본 디렉토리를 알리는 것이 가장 좋습니다. 예:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

이렇게하면 자신의 tarfile을 제외 할 필요가 없습니다. 다른 주석에서 언급했듯이 -A는 숨겨진 파일을 나열합니다.


0

10 년 후, tarGit 2.30 (Q1 2021)에 설명 된를 대신 하여 " git archive" ( man ) 을 사용하여 tar 대신 릴리스 tarball을 생성합니다 .
(그 대안을 적용하기 위해 Git 2.30이 필요하지 않습니다)

참조 4,813,277 커밋 (2020 10월 11일을), 및 93e7031 커밋 에 의해 (2020년 10월 10일) 르네 Scharfe을 ( rscharfe) .
(Merged by Junio ​​C gitsterHamano -- in commit 63e5273 , 27 Oct 2020)

Makefile: dist-doc에 git init / add / commit / archive 사용

서명자 : René Scharfe

tar 대신 ( man ) 명령을 사용하여 HTML 문서 및 맨 페이지에 대한 배포 아카이브를 생성하여 외부 도구에 대한 종속성을 줄이십시오 . 이는 아카이브 항목에 바이너리 용 dist 아카이브의 메타 데이터와 동일한 메타 데이터를 제공합니다.git

그래서 대신 :

tar cf ../archive.tar .

Git 만 사용할 수 있습니다.

git -C workspace init
git -C workspace add .
git -C workspace commit -m workspace
git -C workspace archive --format=tar --prefix=./ HEAD^{tree} > workspace.tar
rm -Rf workspace/.git

여기설명 된 것처럼 일부 이국적인 플랫폼에는 옵션이없는 오래된 tar 배포판이있을 수 있기 때문에 처음에 제안되었습니다 .


-1

사용하는 find것이 가장 쉬운 방법 일 것입니다.

find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+

find . -maxdepth 1현재 디렉토리에서 모든 파일 / 디렉토리 / symlinks / etc를 찾고에 지정된 명령을 실행합니다 -exec. {}명령 수단의에서 파일 목록이 여기에 표시됩니다\+명령으로 실행된다는 것을 의미합니다 :

tar zcvf workspace.tar.gz .file1 .file2 .dir3

대신에

tar zcvf workspace.tar.gz .file1
tar zcvf workspace.tar.gz .file2
tar zcvf workspace.tar.gz .dir3

-J는 매뉴얼에서 --xz입니다. -c와 함께 컴퓨터가 "재미": 호출 것의 시작에 불과하다
Ricalsin

하하, 집에있는 내 미니 서버는 CPU보다 디스크 공간이 더 제한적입니다. :) 그래도 좋은 지적입니다. gzip을 사용하도록 변경하겠습니다.
Andrew Gunnerson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.