Làm thế nào để tập tin tar với một thứ tự sắp xếp?


10

Nếu bạn tarmột thư mục đệ quy, nó chỉ sử dụng thứ tự từ os readdir.

Nhưng trong một số trường hợp, thật tuyệt khi tar các tập tin được sắp xếp.

Cách tốt để tar một thư mục được sắp xếp theo thứ tự abc?


Lưu ý, với mục đích của câu hỏi này, gnu-tar trên một hệ thống Linux điển hình là ổn.


có thể trùng lặp dưới, Kiểm tra bên dưới liên kết unix.stackexchange.com/questions/120143/... superuser.com/questions/172367/...
Jaymin Dabhi

Tôi đã thấy điều này, nhưng tôi không hỏi làm thế nào để đặt hàng, thay vào đó tôi muốn sắp xếp chúng.
ideaman42

Xem thêm unix.stackexchange.com/a/67018 để sắp xếp cây thư mục theo tên.
Stéphane Chazelas

Câu trả lời:


17

Đối với một GNU tar:

--sort=ORDER
 Specify the directory sorting order when reading directories.
 ORDER may be one of the following:

`none'
      No directory sorting is performed. This is the default.

`name'
      Sort the directory entries on name. The operating system may
      deliver directory entries in a more or less random order, and
      sorting them makes archive creation reproducible.

`inode'
      Sort the directory entries on inode number. Sorting
      directories on inode number may reduce the amount of disk
      seek operations when creating an archive for some file
      systems.

Có lẽ bạn cũng sẽ muốn xem xét --preserve-order.


8
--sortđã được giới thiệu trong phiên bản tar 1.28. --preserve-orderkhông liên quan đến câu hỏi này
mhsmith 3/03/2016

Tôi đang có tar: Exiting with failure status due to previous errorslỗi. @mhsmith
alper

3

Với zsh, thay vì:

pax -w dir

Sử dụng:

pax -dw dir dir/**/*(D)

Bạn có thể làm tương tự với các phiên bản gần đây của bash -O globstar -O dotglob:

pax -dw dir/**

Hoặc các phiên bản gần đây của FIGNORE='@(.|..)' ksh93 -o globstarvới:

pax -dw dir dir/**

paxlà lệnh tiêu chuẩn để tạo tartập tin. Đầu ra đi đến thiết bị xuất chuẩn. Vỏ quả cầu được sắp xếp theo tên.

Nếu bạn gặp phải một danh sách Arg quá dài , bạn có thể thay đổi thành:

printf '%s\0' dir dir/**/*(D) | pax -0dw

(không phải tất cả các paxtriển khai hỗ trợ -0mặc dù).


2

tarchính nó không thể làm điều này, vì vậy bạn phải tạo nó từ một danh sách được sắp xếp chính xác. Về nguyên tắc, sau đó bạn có thể sử dụng tùy chọn tarcủa mình -T, nhưng không có cách nào để xác định rằng tên tệp trong danh sách đó phải được chấm dứt NUL. Vì vậy, nếu bạn có bất kỳ tên tệp nào có dòng mới trong đó (được cho phép) thì điều này sẽ bị hỏng.

Tùy chọn tốt hơn là sử dụng cpiođể tạo các tệp vì chấp nhận danh sách tên tệp đã kết thúc NUL và có thể tạo tệp tar.

Nếu tarlệnh của bạn sẽ là:

tar cvf /somedir/all.tar .

Sau đó, để điều này được sắp xếp theo tên bạn sẽ phải làm (giả sử GNU find và cpio):

find . -type f -print0 | sort -z | \
  cpio --create --null --format=ustar -O /somedir/all.tar

Điều này có nhược điểm mặc dù các thư mục con được đặt ở giữa tên tệp. Bạn có thể thực hiện các thủ thuật với finds -printf0 chỉ định thư mục và thông tin độ sâu và sắp xếp với sort -nnhưng điều đó cũng ảnh hưởng đến cách các tệp có số được sắp xếp trong một thư mục.

Nếu những điều trên không thỏa đáng, bạn có thể sử dụng một chương trình python nhỏ dựa trên os.walk()để tạo ra thứ tự bạn muốn với toàn quyền kiểm soát (độ sâu trước, dựa trên extenion, v.v.), nhưng nếu bạn đi theo con đường đó, bạn cũng có thể bỏ cpiovà viết ra tartập tin với tarfilemô-đun của python .


1
--null chỉ định rằng -T lấy chuỗi kết thúc null.
psusi
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.