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

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 사용)



답변

압축하려는 디렉토리에 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합니다.


답변

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

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


답변

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

  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 .


답변

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

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


답변

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

cd ..
tar czf workspace.tar.gz workspace

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


답변

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

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


답변

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

tar -czf workspace.tar.gz .

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

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