Cách chuyển đổi tập tin tar từ định dạng gnu sang định dạng pax


7

Một mặt tôi có rất nhiều tệp tar được tạo với định dạng gnu và mặt khác tôi có một công cụ chỉ hỗ trợ định dạng pax (còn gọi là posix ). Tôi đang tìm kiếm một cách dễ dàng để chuyển đổi các tệp tar hiện có sang định dạng pax - mà không cần trích xuất chúng vào hệ thống tệp và tạo lại tài liệu lưu trữ.

GNU tar hỗ trợ cả hai định dạng. Tuy nhiên, tôi chưa tìm thấy một cách dễ dàng để chuyển đổi.

Làm cách nào tôi có thể chuyển đổi các tập tin tar gnu hiện có sang pax ?

[Tôi đã hỏi cùng một câu hỏi trên superuser.com và một nhà bình luận khuyên nên chuyển câu hỏi sang unix.stackexchange.com.]

Câu trả lời:


6

Bạn có thể làm điều này bằng cách sử dụng bsdtar :

ire@localhost: bsdtar -cvf pax.tar --format=pax @gnu.tar
ire@localhost:file gnu.tar
gnu.tar: POSIX tar archive (GNU)
ire@localhost:file pax.tar
pax.tar: POSIX tar archive

@archivelà lựa chọn kỳ diệu. Từ trang hướng dẫn :

@archive
     (c and r mode only) The specified archive is opened and the
     entries in it will be appended to the current archive.  As a sim-
     ple example,
       tar -c -f - newfile @original.tar
     writes a new archive to standard output containing a file newfile
     and all of the entries from original.tar.  In contrast,
       tar -c -f - newfile original.tar
     creates a new archive with only two entries.  Similarly,
       tar -czf - --format pax @-
     reads an archive from standard input (whose format will be deter-
     mined automatically) and converts it into a gzip-compressed pax-
     format archive on stdout.  In this way, tar can be used to con-
     vert archives from one format to another.

1
Tại sao gnu tar không thể làm điều đó đơn giản và rõ ràng? +1
Serge

3

Người dùng Random832 đã viết:

[...] Tạo một tệp tar trống [...]
Tuyên bố miễn trừ trách nhiệm: Tôi chưa kiểm tra tập lệnh này.

Chúa phù hộ bạn! Bạn đã cho tôi ý tưởng. Tôi đã kiểm tra tập lệnh của bạn, nhưng nếu ai đó tạo một tệp tar trống, tar không coi đó là tệp "posix tar". Vì vậy, tôi đã viết một tập lệnh tạo ra một tập tin "posix tar" với một cái gì đó bên trong, và cuối cùng xóa nó. Tôi đặt tên cho nó là "gnu2posix", mọi người có thể sử dụng nó một cách tự do:

#!/bin/bash
set -o nounset

### // Convert a tar file, from the "gnu tar" format to the "posix tar" one (which in Windows, for example, allows seeing correctly all of the utf-8 characters of the names of the files)

NAME_PROGRAM=$(basename "$0")

alert() {
  echo "$@" >&2 ;
}

alert_about_usage() {
echo "The usage of this program is: $NAME_PROGRAM FILE_TO_CONVERT RESULTING_FILE" >&2
}

if [[ $# != 2 ]]; then
    alert "ERROR: the program \"$NAME_PROGRAM\" needs two arguments, but it has received: $#." 
    alert_about_usage
    exit 1;
fi

file_to_convert="$1"

if [[ ! -f "$file_to_convert" ]]; then
    error "ERROR: the program \"$NAME_PROGRAM\" can't access any file with this path: \"$file_to_convert\"."
    alert_about_usage
    exit 1;
fi

resulting_file="$2"

# // Create a file with something inside, in this case, the "." folder (without its contents). This way, a real "posix tar" is created
tar --format=posix -cf "$resulting_file" . --no-recursion

# // Add "$file_to_convert", finally getting a "posix tar" file
tar -Avf "$resulting_file" "$file_to_convert"  

# // Just in case, delete the "." folder from the file
tar -f "$resulting_file" --delete "."


# // End of file

2

Gnu tar có tùy chọn "concatenate", nhưng yêu cầu kho lưu trữ đích đã tồn tại do trường hợp sử dụng dự định.

tar --format=posix -cvf converted.tar --files-from=/dev/null # create an empty tar file
tar --format=posix -Avf converted.tar original.tar

Tuyên bố miễn trừ trách nhiệm: Tôi chưa thử nghiệm kịch bản này.


Từ tài liệu này, tôi đã có ấn tượng rằng điều này sẽ tạo ra các tệp tar không hợp lệ nếu các định dạng nguồn và đích khác nhau, nhưng tôi chưa kiểm tra điều đó.
ire_and_curses

CẢNH BÁO điều này được biết là tạo tài liệu lưu trữ bị lỗi vì GNU tar không quan tâm đến các định dạng lưu trữ.
schily
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.