tar 파일을 gnu 형식에서 pax 형식으로 변환하는 방법

tar 파일을 gnu 형식에서 pax 형식으로 변환하는 방법

한편으로는 다음으로 생성된 tar 파일이 많이 있습니다.암소 비슷한 영양반면에 저는 다음과 같은 형식만 지원하는 도구를 가지고 있습니다.공원(일명POSIX) 형식. 기존 tar 파일을 파일 시스템으로 추출하고 아카이브를 다시 생성하지 않고 pax 형식으로 변환하는 쉬운 방법을 찾고 있습니다.

GNU tar는 두 형식을 모두 지원합니다. 그러나 나는 그것을 변환하는 쉬운 방법을 찾지 못했습니다.

기존 변환 방법암소 비슷한 영양tar 파일을공원?

[저는 superuser.com에 동일한 질문을 했고 댓글 작성자는 해당 질문을 unix.stackexchange.com으로 마이그레이션할 것을 제안했습니다. ]

답변1

다음을 사용하여 이 작업을 수행할 수 있습니다.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

@archive그것은 마법의 선택입니다. ~에서맨페이지:

@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.

답변2

사용자 Random832가 썼습니다:

[...] 빈 tar 파일을 생성합니다. [...]
면책조항: 저는 이 스크립트를 테스트하지 않았습니다.

하나님의 축복이 있기를! 당신은 나에게 아이디어를 주었다. 귀하의 스크립트를 테스트했지만 누군가 빈 tar 파일을 생성하면 tar는 이를 "posix tar" 파일로 처리하지 않습니다. 그래서 일부 내용이 포함된 "posix tar" 파일을 생성한 다음 마지막에 삭제하는 스크립트를 작성했습니다. 나는 그것을 "gnu2posix"라고 명명했고 사람들은 그것을 자유롭게 사용할 수 있습니다:

#!/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

답변3

Gnu tar에는 "연결" 옵션이 있지만 의도된 사용 사례로 인해 대상 아카이브가 이미 존재해야 합니다.

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

면책조항: 저는 이 스크립트를 테스트하지 않았습니다.

관련 정보