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

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

calendar_final /._ style.css

calendar_final / style.css

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



답변

귀하는 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


답변

이것은 작동해야합니다 :

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


답변

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


답변

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


답변

다음과 같이하세요:

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

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

    tar -cvf name.tar /path/to/directory
    

답변