Làm cách nào để tạo một tệp tar theo thứ tự bảng chữ cái?


19

Tôi muốn tạo một tệp tar trong đó tất cả các thư mục và tệp được xử lý theo thứ tự bảng chữ cái. Cái này dành cho toàn bộ hệ thống phân cấp thư mục đang bị hủy bỏ, vì vậy nó sẽ bắt đầu bằng cách xử lý thư mục đầu tiên theo thứ tự bảng chữ cái, rồi thư mục con trong đó theo thứ tự abc, v.v. Tôi đã xem qua trang man và không thể tìm thấy công tắc nào cho việc này.

Tôi sẽ thừa nhận, đây là một nửa mới lạ, tối ưu hóa một nửa. Tôi không thể tin rằng không có cách nào dễ dàng để làm điều này. Chắc chắn là tôi đang thiếu gì đó.


2
tại sao bạn muốn làm việc này?
matthias krull

Hầu hết, đó là vì tôi muốn biết mức độ hoàn thành của thao tác tar. Khi các tệp đang được tải theo thứ tự ngẫu nhiên, không có cách nào để nói với cờ -v.
Erick Robertson

2
Điều đó không hoàn toàn đúng; Nếu bạn chuyển đầu ra thành một tệp và biết số lượng tệp (giả sử lệnh tìm nhanh), bạn có thể so sánh đầu ra -v (wc -l) với số lượng tệp tìm thấy để hiểu được tiến trình ...
Slartibartfast

2
@matthiaskrull Tôi có lý do không liên quan đến việc này, tôi đang tạo một Tập tin OVA (là một tệp tar) để triển khai VM trên VMWare ESX Server. OVA cần các tệp theo một thứ tự cụ thể bên trong nó (Tệp đầu tiên phải là OVF, v.v.).
xask

1
Ngoài ra còn có một lý do rất tốt cho việc này: hiệu suất trên một tệp rất lớn khi bạn muốn trích xuất chỉ một phần của nó. Vì thứ tự của nó là mặc định ngẫu nhiên và bạn muốn trích xuất một tệp / thư mục, nếu nó được yêu cầu, nó sẽ nhanh hơn, nếu không, nó sẽ cần quét toàn bộ kho lưu trữ trước khi biết nó đã hoàn thành.
StormByte

Câu trả lời:


9

Slartibartfast đang đi đúng hướng, nhưng hành vi mặc định của tar là đi xuống các thư mục, do đó bạn có thể nhận được nhiều bản sao của cùng một tệp có trong tệp tar được tạo. Bạn có thể kiểm tra bằng cách làm tar tf file.tar | sort Cách giải quyết là bao gồm tùy chọn --no-đệ quy cho tar. Ngoài ra, bạn sẽ có thể gửi tên tệp lạ bằng cách sử dụng -print0 tùy chọn để tìm, sau đó sử dụng --null tùy chọn để tar. Kết quả cuối cùng trông như thế này:

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

Bạn có thể kiểm tra thứ tự trong tệp tar bằng cách sử dụng tar tsf tarfile.tar. Mặc dù có lẽ bạn sẽ không bao giờ cần các tùy chọn -print0, -z và --null trừ khi bạn biết bạn sẽ gặp một tên tệp có dòng mới được nhúng trong đó, tôi chưa bao giờ thử nó.


Gợi ý tuyệt vời cho việc sử dụng tùy chọn --no-đệ quy, cảm ơn.
Erik

Đây là giải pháp hiệu quả với tôi. Tôi có một trường hợp sử dụng khác với Erick và Google đã đưa tôi đến đây. Tôi đang thu thập ảnh chụp nhanh theo thời gian của trạng thái hoàn chỉnh của một hệ thống từ xa. Dữ liệu rất dư thừa. Sắp xếp đầu vào tar theo thời gian (tên tệp có dấu thời gian) sẽ cải thiện hiệu suất của máy nén. Một thử nghiệm nhanh cho thấy sự cải thiện theo yếu tố 2 (lzma2). Ngoài ra, tôi không giải nén tệp lưu trữ vào một hệ thống tệp, nhưng thực hiện xử lý luồng trên các mục tar. Một luồng được sắp xếp làm cho đầu ra gỡ lỗi đẹp hơn và có các lợi ích khác trong chuỗi quy trình. +1
Johannes

5

Thứ tự của các tệp trong tệp tar không thực sự quan trọng, vì khi các tệp được giải nén, hệ thống tệp sẽ không giữ nguyên thứ tự.

Không có công tắc nào cho việc này, nhưng nếu bạn thực sự muốn nó, bạn có thể cung cấp cho tar danh sách tên tệp theo thứ tự được sắp xếp và nó sẽ tạo tệp tar theo thứ tự bạn đưa ra.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
hoặc chỉ sắp xếp đầu ra: tar tf tarfile | sort
Doug Harris

Tôi có quá nhiều tệp (20.000+) để chỉ định tất cả chúng trên dòng lệnh.
Erick Robertson

3
Thứ tự của các tệp trong tệp tar không thành vấn đề nếu bạn cần giải nén và hiển thị trong khi tải xuống.
Erik

Phụ thuộc vào hệ thống tập tin.
Thorbjørn Ravn Andersen

4

Giả sử bạn không có bất kỳ tệp nào có dòng mới trong tên:

find /source_directory -print | sort | tar -czf target.tgz -T -

Nếu điều đó không hiệu quả (chưa bao giờ thử nó, vì vậy tôi không biết - có nghĩa là stdin cho đối số -T):

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

Sau đó là câu hỏi tại sao. Nhưng đôi khi nó dễ dàng hơn để không hỏi.


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax là loại kế thừa POSIX cho cpio và tar và loại cầu chì các khía cạnh tốt nhất của cả hai. Nó viết lưu trữ tar (ustar) theo mặc định. Nó cũng tự động kéo dài và nhắc nhở cho phương tiện truyền thông và in một bản tóm tắt khi hoàn thành.


0

Thay thế cho câu trả lời của @ CharlieHerron, nếu bạn chỉ muốn bảo tồn nội dung (tệp, liên kết tượng trưng) và siêu dữ liệu thư mục (ví dụ: quyền thư mục, mtime, v.v.), bạn có thể muốn lọc các thư mục khỏi find đầu ra của.

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
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.