Como converter arquivo tar do formato gnu para o formato pax

7

Por um lado eu tenho um monte de arquivos tar criados com o formato gnu , e por outro lado eu tenho uma ferramenta que suporta apenas pax (aka posix ). Eu estou procurando uma maneira fácil de converter os arquivos tar existentes para o formato pax - sem extraí-los para o sistema de arquivos e recriar os arquivos.

O GNU tar suporta ambos os formatos. No entanto, não encontrei um caminho fácil para a conversão.

Como posso converter os arquivos tar existentes do gnu para pax ?

[Eu fiz a mesma pergunta no superusuário.com.br, e um comentarista recomendou a migração da questão para o unix.stackexchange.com.]

    
por nosid 27.09.2012 / 05:36

3 respostas

6

Você pode fazer isso usando 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 é a opção mágica. Na página de manual :

@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.
    
por 27.09.2012 / 06:57
3

O usuário Random832 escreveu:

[...] create an empty tar file [...]
Disclaimer: I have not tested this script.

Deus te abençoe! Você me deu idéias. Eu testei o seu script, mas se alguém cria um arquivo tar vazio, o tar não o considera um arquivo "posix tar". Então eu escrevi um script que cria um arquivo "posix tar" com algo dentro, e finalmente o apaga. Eu chamei de "gnu2posix", as pessoas podem usá-lo livremente:

#!/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
    
por 19.10.2012 / 10:42
2

O Gnu tar tem uma opção de "concatenar", mas requer que o arquivo de destino já exista devido ao caso de uso pretendido.

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

Aviso: Eu não testei este script.

    
por 27.09.2012 / 16:51