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

免責事項:私はこのスクリプトをテストしていません。

関連情報