숨겨진 파일을 제외하고 디렉토리의 tar 아카이브를 작성 하시겠습니까?


17

하위 디렉토리가있는 특정 디렉토리의 tar 아카이브를 만들고 싶습니다. 그러나 tar 명령을 사용하면 다음과 같이 포함 된 파일 목록이 표시됩니다.

calendar_final /._ style.css

calendar_final / style.css

보시다시피, 동일한 파일의 두 가지 버전이 있습니다. 이것은 모든 파일에 적용되며 많은 파일이 있습니다. tar 아카이브에서 접두사가 ._ 인 임시 파일을 어떻게 제외합니까?


도움이 될 것입니다 : unix.stackexchange.com/questions/2213/…
tshepang

이들은 임시 파일은 아니지만 OS X 파일 시스템 메타 데이터를 나타냅니다 (실수하지 않으면 파인더 레이블, 유형 및 작성자 코드, 확장 된 속성 등이 포함됩니다). OS X에서 tar를 작성하기 전에 이러한 파일이 존재하지 않습니다. 가능한 대답은 OS X / HFS + 또는 다른 시스템에 있는지 여부에 따라 다릅니다.
Daniel Beck

답변:


33

귀하는 Mac OS X 시스템에서 작업하고 있다는 의견을 게시했습니다. 이것은 이러한 ._*파일 의 목적에 대한 중요한 단서 입니다.

이러한 ._*아카이브 항목은 해당 파일과 관련된 추가 정보 ( 접두사가 없는 파일)를 포함하는 AppleDouble 데이터 덩어리입니다 ._. 이들은 Mac OS X 고유의 copyfile (3) 기능 군에 의해 생성됩니다 . AppleDouble Blob은 ACL (액세스 제어 데이터) 및 확장 된 속성 (일반적으로 Finder 플래그 및 "리소스 포크"이지만 xattrs는 모든 종류의 데이터를 저장하는 데 사용할 수 있음)을 저장합니다.

이 시스템이 제공하는 맥 OS X는 도구 (아카이브 bsdtar(도로 심볼릭 링크 tar), gnutarpax)를 생성 ._*그와 관련된 확장 된 정보를 가진 파일에 대한 아카이브 부재 "보관 해제"모드에서는 해당 아카이브 멤버를 디코딩하고 결과 확장 정보를 관련 파일에 적용합니다. 이렇게하면 HFS + 파일 시스템이 저장할 수있는 모든 정보를 보존하고 나중에 추출하여 Mac OS X 시스템에서 사용할 수있는“완전한 충실도”아카이브가 생성됩니다.

다른 시스템의 해당 아카이브 도구는 이러한 ._*파일 을 특수하게 처리하는 것을 알지 못 하므로 일반 파일로 압축이 풀립니다. 이러한 파일은 다른 시스템에서 상당히 쓸모가 없으므로 종종 "정크 파일"로 간주됩니다. 이에 따라 Mac OS X 이외의 시스템에서로 시작하는 일반 파일이 포함 된 아카이브를 생성 ._하면 Mac OS X 보관 해제 도구는 해당 파일을 확장 정보로 디코딩하려고 시도합니다.

그러나 시스템 제공 Mac OS X 아카이버가 다른 Unixy 시스템 에서처럼 COPYFILE_DISABLE 환경 변수처럼 동작하도록하는 문서화되지 않은 (?) 방법이 있습니다. 이 변수 (빈 문자열까지도)를 설정하면 아카이버 ._*가 아카이브 파일과 연관된 확장 정보를 나타내는 아카이브 멤버를 생성하지 못하게 됩니다. 그 존재는 또한 아카이버가 그러한 아카이브 멤버를 확장 정보로 해석하려고 시도하지 못하게합니다.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

이 방법을 자주 사용하지 않으려면 쉘의 초기화 파일에서이 변수를 설정할 수 있습니다.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

그런 다음 확장 정보를 유지 / 복원하기 위해 기능을 다시 활성화해야하는 경우 개별 명령에 대해 변수를 "설정 해제"할 수 있습니다.

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Mac OS X 10.4의 아카이버도 비슷한 환경 변수를 사용하지만 COPY_EXTENDED_ATTRIBUTES_DISABLE


아무도 이것이 작동하지 않는 것을 보았습니까? 요세미티에서이 솔루션을 사용해 보았고 AIX 상자에서 압축을 풀면 PaxHeader 디렉토리가 계속 생성됩니다
conorgriffin

5

이것은 작동해야합니다 :

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

/ : 나는 그들이 포함 된 것을 발견했다, 내가 아카이브를 압축을 풀 때 실제로 일을하지만, 생각

이상하게도 어떤 타르 버전을 사용하십니까? tar --version여기에 GNU 1.23을 제공합니다.
Frederik Deweerdt

1
이러한 파일은 OS X의 파일 시스템 메타 데이터이며 tar를 실행하기 전에 존재하지 않으므로이 방법으로 제외 할 수 없습니다. 다른 Mac에 보관 된 압축을 풀 때 OS X 파일 메타 데이터를 복원 할 수 있도록 포함되어 있습니다.
Daniel Beck

나를 위해 작동합니다. tar vzcf ...잘못된 파일이 포함되어 있는지 확인하는 것이 좋습니다 .
stribika

@stribika 그는 OS X에서 가장 가능성이 높습니다. 질문에 대한 내 의견을 참조하십시오. tar 아카이브 외부에 존재하지 않으므로 파일을 제외 할 수 없습니다.
Daniel Beck

2

Frederik Deweerdt 는 GNU tar (Linux, Cygwin, FreeBSD, OSX 등에서 사용 가능)에서 작동하지만 NetBSD, OpenBSD 또는 Solaris와 같은 다른 시스템에서는 작동하지 않는 솔루션을 제공했습니다.

POSIX는 tar명령을 지정하지 않고 (UNIX 변형에 따라 크게 달라지기 때문에) pax대신 명령을 도입합니다 . 이 옵션 -w은 아카이브를 생성 ( -r추출) -x하고 아카이브 형식을 선택하는 것을 의미 합니다. 이 옵션 -s '!BRE!!'은 경로가 기본 정규식 BRE와 일치하는 모든 파일을 제외합니다.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

흥미 롭다. 나는 pax에 대해 몰랐다.
개브.

2

현재로 bsdtar 3.0.3 - libarchive 3.0.3(아마도 이전)에 대한 새로운 (맥 OS X의 특정) 옵션이있다 bsdtar라고 명령 --disable-copyfile의 생성 억제 ._파일. 이전 버전 tar에는 --disable-copyfile옵션이 없지만 환경 변수를 설정하면 COPYFILE_DISABLE=1작동합니다.


으로 bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile그럼에도 불구하고 문서화하지만 사용할 수 없습니다.
Stefan Schmidt

0

다음과 같이하세요:

  1. 모든 ._파일을 찾아서 삭제할 -ls수 있도록 모든 파일을 찾아서 나열 하십시오 ._.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. 를 사용하여 아카이브 .tar를 작성하십시오.

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