Tạo lưu trữ tar của một thư mục, ngoại trừ các tập tin ẩn?


17

Tôi muốn tạo một kho lưu trữ tar của một thư mục cụ thể (tất nhiên là có thư mục con của nó). Nhưng khi tôi làm điều đó, bằng cách sử dụng lệnh tar, tôi nhận được một danh sách các tệp được bao gồm, ví dụ:

một lịch_final /._ style.css

một lịch_final / style.css

Như bạn có thể thấy, có hai phiên bản của cùng một tệp. Điều này đi cho mọi tập tin, và có rất nhiều. Làm cách nào để loại trừ các tệp tạm thời, với tiền tố ._ khỏi kho lưu trữ tar?



Đây không phải là các tệp tạm thời, nhưng đại diện cho siêu dữ liệu của hệ thống tệp OS X (nếu tôi không nhầm, chúng bao gồm nhãn Finder, mã loại và mã người tạo, thuộc tính mở rộng, v.v.). Các tệp này không tồn tại trước khi tạo tar trên OS X. Các câu trả lời có thể phụ thuộc vào việc bạn đang sử dụng OS X / HFS + hay hệ thống khác.
Daniel Beck

Câu trả lời:


33

Bạn đã đăng trong một bình luận rằng bạn đang làm việc trên hệ thống Mac OS X. Đây là một đầu mối quan trọng cho mục đích của các ._*tập tin này .

Các ._*mục lưu trữ này là các khối dữ liệu AppleDouble chứa thông tin bổ sung được liên kết với tệp tương ứng (tệp không có ._tiền tố). Chúng được tạo bởi nhóm chức năng copyfile (3) cụ thể của Mac OS X. Các đốm màu AppleDouble lưu trữ dữ liệu kiểm soát truy cập (ACL) và các thuộc tính mở rộng (thông thường, cờ Finder và tài nguyên giả mạo forks, nhưng xattrs có thể được sử dụng để lưu trữ bất kỳ loại dữ liệu nào).

Các công cụ lưu trữ Mac OS X do hệ thống cung cấp ( bsdtar(cũng được liên kết dưới dạng tar) gnutarpax) sẽ tạo ._*thành viên lưu trữ cho bất kỳ tệp nào có bất kỳ thông tin mở rộng nào liên quan đến nó; trong chế độ không lưu trữ của người dùng, họ cũng sẽ giải mã các thành viên lưu trữ đó và áp dụng thông tin mở rộng kết quả cho tệp được liên kết. Điều này tạo ra một kho lưu trữ đầy đủ độ trung thực của người dùng để sử dụng trên các hệ thống Mac OS X bằng cách lưu giữ và trích xuất tất cả thông tin mà hệ thống tệp HFS + có thể lưu trữ.

Các công cụ lưu trữ tương ứng trên các hệ thống khác không biết xử lý đặc biệt cho các ._*tệp này , vì vậy chúng được giải nén như các tệp thông thường. Vì các tệp như vậy khá vô dụng trên các hệ thống khác, nên chúng thường được xem là các tệp rác của Wikipedia. Tương ứng, nếu một hệ thống Mac OS X không phải của chương trình tạo ra một kho lưu trữ bao gồm các tệp bình thường bắt đầu ._, các công cụ hủy lưu trữ Mac OS X sẽ cố gắng giải mã các tệp đó dưới dạng thông tin mở rộng.

Tuy nhiên, có một cách không có giấy tờ (?) Để làm cho các trình lưu trữ Mac OS X do hệ thống cung cấp hoạt động giống như trên các hệ thống Unixy khác: biến môi trường COPYFILE_DISABLE. Đặt biến này (thành bất kỳ giá trị nào, ngay cả chuỗi trống), sẽ ngăn người lưu trữ tạo ._*thành viên lưu trữ để thể hiện bất kỳ thông tin mở rộng nào được liên kết với các tệp được lưu trữ. Sự hiện diện của nó cũng sẽ ngăn các nhà lưu trữ cố gắng diễn giải các thành viên lưu trữ như là thông tin mở rộng.

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

Bạn có thể đặt biến này trong tệp khởi tạo shell của mình nếu bạn muốn làm việc theo cách này thường xuyên hơn không.

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

Sau đó, khi bạn cần kích hoạt lại tính năng (để lưu giữ / khôi phục thông tin mở rộng), bạn có thể hủy cài đặt biến số cho các lệnh riêng lẻ:

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

Các trình lưu trữ trên Mac OS X 10.4 cũng thực hiện một số thứ tương tự, mặc dù chúng sử dụng một biến môi trường khác: COPY_EXTENDED_ATTRIBUTES_DISABLE


có ai thấy cái này không hoạt động không? Tôi đã thử giải pháp này trên Yosemite và khi tôi giải nén trên hộp AIX, các thư mục PaxHeader vẫn được tạo
conorgriffin

5

Điều này sẽ làm việc:

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

Tôi nghĩ rằng nó hoạt động nhưng thực sự khi tôi giải nén kho lưu trữ, tôi thấy rằng chúng đã được bao gồm: /

Thật lạ, bạn sử dụng phiên bản tar nào? tar --versioncung cấp cho GNU 1.23 ở đây.
Frederik Deweerdt

1
Các tệp đó là siêu dữ liệu hệ thống tệp trên OS X và không tồn tại trước khi chạy tar, vì vậy có lẽ không thể loại trừ theo cách này. Chúng được bao gồm để cho phép khôi phục siêu dữ liệu tệp OS X khi giải nén được lưu trữ trên máy Mac khác.
Daniel Beck

Làm việc cho tôi. Tôi khuyên bạn nên sử dụng tar vzcf ...để xem nếu có bất kỳ tập tin sai được bao gồm.
stribika

@stribika Anh ấy rất có thể trên OS X. Xem bình luận của tôi về câu hỏi. Các tập tin không thể được loại trừ vì chúng không tồn tại bên ngoài kho lưu trữ tar.
Daniel Beck

2

Frederik Deweerdt đã đưa ra một giải pháp hoạt động trên GNU tar (được sử dụng trên Linux, Cygwin, FreeBSD, OSX, có thể là các giải pháp khác), nhưng không phải trên các hệ thống khác như NetBSD, OpenBSD hoặc Solaris.

POSIX không chỉ định tarlệnh (vì nó thay đổi quá dữ dội giữa các biến thể unix) và paxthay vào đó giới thiệu lệnh. Tùy chọn này -wcó nghĩa là tạo ra một kho lưu trữ ( -rtrích xuất) và -xchọn định dạng lưu trữ. Tùy chọn -s '!BRE!!'loại trừ tất cả các tệp có đường dẫn khớp với biểu thức chính quy BRE.

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

Thật thú vị ... Tôi không biết về pax.
gabe.

2

Kể từ bsdtar 3.0.3 - libarchive 3.0.3(và có lẽ trước đó), có một tùy chọn mới (cụ thể cho Mac OS X) đối với bsdtarlệnh được gọi --disable-copyfileđể ngăn chặn việc tạo ._tệp. Các phiên bản cũ hơn tarkhông có --disable-copyfiletùy chọn, nhưng cài đặt biến môi trường COPYFILE_DISABLE=1sẽ hoạt động.


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

0

Thực hiện theo các bước sau:

  1. Tìm tất cả ._các tệp và liệt kê chúng bằng cách sử dụng -lsđể bạn có thể thấy tất cả._ các tệp và cuối cùng xóa chúng.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Tạo lưu trữ .tar bằng cách sử dụng.

    tar -cvf name.tar /path/to/directory
    
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.