OS X의 tarball에서 ._foo와 같은 파일을 얻는 이유는 무엇입니까? 운영 체제에서 추출한 경우에만 나타납니다. 그러나 ._foo내

OS X에서 특정 파일을 tar 할 때 :

tar cvf foo.tar foo

._footarball에 추가 파일 을 생성합니다 .

./._foo
foo

Mac 이외의 운영 체제에서 추출한 경우에만 나타납니다. 그러나 ._foo내 파일 시스템에 존재하지 않습니다! 무슨 일이야? 어떻게 제거 할 수 있습니까?



답변

OS X의 tar는 AppleDouble 형식을 사용하여 확장 된 속성 및 ACL을 저장합니다.

$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls -le@ *
-rw-r--r--@ 1 lauri  staff  0 May 25 07:09 file1
    key 5
-rw-r--r--+ 1 lauri  staff  0 May 25 07:09 file2
 0: group:admin allow delete
-rw-r--r--  1 lauri  staff  0 May 25 07:09 file3
$ tar -cf 1.tar *
$ tar -tf 1.tar
./._file1
file1
./._file2
file2
file3

OS X의 tar는 또한 ._ 멤버를 기본 형식으로 다시 변환하는 방법을 알고 있지만 일반적으로 다른 플랫폼에서 아카이브를 추출 할 때 ._ 파일이 유지됩니다. COPYFILE_DISABLE을 일부 값으로 설정하여 메타 데이터를 포함하지 않도록 tar에 지시 할 수 있습니다.

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*
$ tar -tf 2.tar
file1
file2
file3
  • 복사 파일 기능은 man copyfile
  • ls -l@확장 된 속성의 키와 크기를 표시하고 ls -leACL을 인쇄합니다
  • xattr -l 확장 된 속성의 키와 값을 나열합니다.
  • xattr -c 모든 확장 된 속성을 지 웁니다 (-d는 단독으로 사용할 수 없습니다)
  • chmod -N ACL을 삭제합니다
  • OS X에서 생성 된 Zip 파일은 __MACOSX 폴더를 사용하여 유사한 메타 데이터를 저장합니다.

확장 된 속성으로 저장된 정보 :

  • 리소스 포크 (리소스 포크는 10.4 이후로 속성이 확장되었습니다)
    • Finder에서 설정 한 사용자 정의 아이콘 및 Icon \ r 파일 이미지
    • PSD 파일의 메타 데이터
    • scpt 파일에 저장된 객체, AppleScript 편집기 윈도우 상태, 스크립트 설명
  • 별명에 대한 정보 (확장 된 속성이 제거되면 별명이 작동하지 않음)
  • 인터넷에서 다운로드 한 파일의 검역 상태 또는 원본 URL
  • 주목 의견
  • TextEdit으로 저장된 파일 인코딩
  • TextMate로 열린 파일의 캐럿 위치
  • 탈지 메모

답변

현재 bsdtar 3.0.3 - libarchive 3.0.3(아마도 이전)에 대한 새로운 옵션이있다 bsdtar라고 명령 --disable-copyfile의 생성 억제 ._파일을.

# on Mac OS X
# /usr/bin/tar -> bsdtar
ls -l /usr/bin/tar

# from man bsdtar
--disable-copyfile
        Mac OS X specific.  Disable the use of copyfile(3).


답변

._다른 답변에서 언급 한 파일은 리소스 포크입니다. 그러나 다음을 사용할 때 제거하는 더 좋은 방법이 있습니다 tar.

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

dot_clean이러한 파일을 정리 하는 유틸리티 도 있습니다 (일반적으로 외부 저장소에 사용되는 것 같습니다).


답변

다음은 해당 파일을 제거하기위한 Python 스크립트입니다. 인기있는 모든 OS에서 작동합니다.

철저히 테스트 하지 않았 으므로 자신의 책임하에 사용하십시오!

import os
import os.path

def dot_clean(folder):
    files = os.listdir(folder)
    for file in files:
        full_name = folder + "/" + file
        if os.path.isdir(full_name):
            dot_clean(full_name)
        elif file.startswith("._"):
            os.remove(full_name)

dot_clean('.')


답변

마침표 문자 “.”는 Mac 플랫폼에서 숨겨진 파일 표시기로 사용됩니다. Windows에서는 “$”문자입니다. 어쨌든 ._foo 파일에는 OS X 관련 정보가 포함되어 있으므로 삭제하지 않는 것이 좋습니다. 다른 시스템에서는이를 무시해야합니다. 그렇지 않으면 여기에서 누군가 “.”로 시작하는 파일과 폴더를 숨기는 스크립트를 제공 할 수 있습니다.


답변