Tại sao tôi nhận được các tệp như ._foo trong tarball của mình trên OS X?


70

Khi tôi tar một số tệp nhất định trong OS X:

tar cvf foo.tar foo

Nó tạo ra một tập tin bổ sung ._footrong tarball:

./._foo
foo

Nó chỉ hiển thị nếu tôi giải nén nó trên hệ điều hành không phải máy Mac. Nhưng ._fookhông tồn tại trên hệ thống tập tin của tôi! Chuyện gì đang xảy ra vậy? Làm sao để tôi thoát khỏi nó?


Ghét nó. Trông xấu xí khi tôi duyệt trong kho lưu trữ với 7-Zip.
Nathaniel

Câu trả lời:


79

Tar của OS X sử dụng định dạng AppleDouble để lưu trữ các thuộc tính và ACL mở rộng.

$ 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

Tar của OS X cũng biết cách chuyển đổi các thành viên ._ trở lại định dạng gốc, nhưng các tệp ._ thường được lưu giữ khi lưu trữ được trích xuất trên các nền tảng khác. Bạn có thể yêu cầu tar không bao gồm siêu dữ liệu bằng cách đặt COPYFILE_DISABLE thành một số giá trị:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Các hàm copyfile được mô tả trong man copyfile
  • ls -l@hiển thị các khóa và kích thước của các thuộc tính mở rộng, ls -lein ACL
  • xattr -l liệt kê các khóa và giá trị của các thuộc tính mở rộng
  • xattr -c xóa tất cả các thuộc tính mở rộng (-d không thể được sử dụng một mình)
  • chmod -N xóa ACL
  • Các tệp zip được tạo trên OS X sử dụng thư mục __MACOSX để lưu trữ siêu dữ liệu tương tự

Thông tin được lưu trữ dưới dạng các thuộc tính mở rộng:

  • Các nhánh tài nguyên (các nhánh tài nguyên đã được mở rộng các thuộc tính kể từ 10,4)
    • Biểu tượng tùy chỉnh được đặt trong Finder và hình ảnh của tệp Icon \ r
    • Siêu dữ liệu trong tệp PSD
    • Các đối tượng được lưu trữ trong các tệp scpt, trạng thái cửa sổ AppleScript Editor, mô tả các tập lệnh
  • Thông tin về bí danh (bí danh ngừng hoạt động nếu thuộc tính mở rộng bị xóa)
  • Kiểm dịch trạng thái hoặc URL nguồn của các tệp được tải xuống từ internet
  • Bình luận nổi bật
  • Mã hóa các tệp được lưu bằng TextEdit
  • Vị trí caret của tệp được mở bằng TextMate
  • Ghi chú sơ sài

Tôi có GNU tar 1.15.1 theo mặc định trên MacOS X 10.5.8 (Leopard). Phiên bản mới nhất từ ​​GNU là 1.22 (tháng 3 năm 2009). Đã tải xuống và xây dựng: dường như không có '--no-xattrs' khi được xây dựng trên MacOS X.
Jonathan Leffler

1
Thay vì xuất biến này ra toàn bộ hệ thống, bạn cũng có thể sử dụng env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly

1
@Cawas, vấn đề là họ đã xuất hiện trong tarball, lúc đó tôi đang phân phối đa nền tảng và chúng không có ý nghĩa gì đối với một hệ điều hành không phải của Apple.
Jesse Beder

1
Đó là Jesse thật, chúng thực sự không có ý nghĩa gì đối với các hệ điều hành / hệ thống tập tin khác . Nhưng thông tin ở đó và ít nhất chúng ta có thể cathoặc typenhìn thấy những gì bên trong. Và đó thường là một văn bản đơn giản được nhập thủ công ở đó. Tôi sẽ không vứt nó đi để sao lưu nhưng nó có thể là rác trong trường hợp bạn muốn phân phối một cái gì đó đa nền tảng và đặc biệt nếu nó ở đó do nhầm lẫn. Chỉ cần nói tùy chọn để lại chúng là khá hợp lệ.
cregox

1
FYI, Dây chuyền xuất khẩu cho Leopard cũng hoạt động cho Lion.
jjeaton

12

Kể từ bsdtar 3.0.3 - libarchive 3.0.3(và có lẽ trước đó), có một tùy chọn mới cho bsdtarlệnh được gọi --disable-copyfileđể ngăn chặn việc tạo ._tệp.

# 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).

3
Với bsdtar 2.8.3 - libarchive 2.8.3các 10.7.5sự --disable-copyfilekhông ghi nhận nhưng sẵn dù sao.
Stefan Schmidt


1

Các ._tập tin là các nhánh tài nguyên như được đề cập trong các câu trả lời khác. Tuy nhiên, có một cách tốt hơn để loại bỏ chúng khi sử dụng tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Ngoài ra còn có một dot_cleantiện ích để dọn dẹp các tệp này (tôi nghĩ rằng nó thường được sử dụng để lưu trữ ngoài).


Cảm ơn! Xem phần cuối của câu trả lời trên của tôi cho giải pháp đó.
Jesse Beder

dot_clean không hoạt động cho việc này vì tar đang tạo các tệp
joedevon

0

Đây là một kịch bản python để loại bỏ các tập tin. Nên làm việc trong bất kỳ hệ điều hành phổ biến.

Không được kiểm tra kỹ lưỡng, sử dụng có nguy cơ của riêng bạn!

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('.')            

1
Chà, ngoại trừ OS X với HFS + ...
Daniel Beck

Tại sao không? Bạn có thể đề nghị làm thế nào để sửa chữa?
Aivar

1
Các tệp này không thực sự tồn tại trên HFS +, vì hệ thống tệp có thể lưu trữ siêu dữ liệu bên trong. Các tệp này là một giải pháp thay thế cho các hệ thống tệp không hỗ trợ điều đó, ví dụ như khi bạn chuyển tệp từ HFS + sang ổ USB FAT, chúng sẽ tồn tại và khi bạn chuyển chúng trở lại, chúng sẽ biến mất.
Daniel Beck

-3

Ký tự dấu chấm, ".", Được sử dụng trên nền tảng Mac làm chỉ báo tệp ẩn. Trên Windows, nó là ký tự "$". Dù sao, tệp ._foo có thể chứa một số thông tin cụ thể về OS X và tôi khuyên bạn không nên xóa nó. Trên các hệ thống khác, bạn sẽ phải bỏ qua nó hoặc ai đó ở đây có thể cung cấp cho bạn một tập lệnh sẽ ẩn các tệp và thư mục bắt đầu bằng dấu ".".


Đó là tất cả siêu dữ liệu, chủ yếu là những thứ như biểu tượng tùy chỉnh, ứng dụng đã tạo tệp, v.v ... An toàn để xóa.
dreamlax

Tuy nhiên, nếu bạn chủ yếu sử dụng Mac, tôi khuyên bạn nên giữ nó. Nếu bạn sử dụng Windows nhiều hơn OS X, thì hãy tiếp tục và tiêu diệt nó.
dbmikus

(@dreamlax) Đúng là phần lớn dữ liệu được lưu trữ trong các thuộc tính mở rộng là siêu dữ liệu có thể an toàn để xóa, nhưng điều đó không phải lúc nào cũng đúng. Đặc biệt, khi các tệp có tài nguyên giả mạo, các nhánh được lưu trữ trên một thứ gì đó không có nguồn gốc HFS (FAT, UFS, tar, v.v.), các tệp '._ *' này được sử dụng để giữ dữ liệu từ (trong số các thuộc tính mở rộng khác) dĩa tài nguyên. Mặc dù nhiều định dạng tệp đang chuyển sang sử dụng các nhánh tài nguyên (hướng tới các gói), có một số tệp lưu trữ dữ liệu quan trọng trong ngã ba tài nguyên (đôi khi dữ liệu tài nguyên là dữ liệu duy nhất).
Chris Johnsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.