web-dev-qa-db-ja.com

ソートされた順序でファイルをタール化​​する方法は?

ディレクトリを再帰的にtarする場合、OSのreaddirからの順序を使用するだけです。

しかし、場合によっては、ファイルをtarでソートしておくと便利です。

アルファベット順にソートされたディレクトリをtarする良い方法は何ですか?


この質問の目的のために、典型的なLinuxシステムのgnu-tarは問題ありません。

10
ideasman42

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.

また、--preserve-orderも確認する必要があります。

17
mikeserv

zshの代わりに:

_pax -w dir
_

使用する:

_pax -dw dir dir/**/*(D)
_

最近のバージョンの_bash -O globstar -O dotglob_でも同じことができます:

_pax -dw dir/**
_

またはFIGNORE='@(.|..)' ksh93 -o globstarの最近のバージョン:

_pax -dw dir dir/**
_

paxは、tarファイルを作成するための標準コマンドです。出力はstdoutに送られます。シェルグロブは名前でソートされます。

Arg list too longエラーが発生した場合は、次のように変更できます。

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

(ただし、すべてのpax実装が_-0_をサポートしているわけではありません)。

3

tar自体はこれを実行できないため、正しく順序付けされたリストから作成する必要があります。原則として、次にtarの_-T_オプションを使用できますが、そのリストのファイル名をNULで終了するように指定する方法はありません。したがって、改行が含まれているファイル名がある場合(これは許可されます)、これは壊れます。

cpioを使用してファイルを生成することをお勧めします。これは、NULで終了するファイル名のリストを受け入れ、tarファイルを生成できるためです。

tarコマンドが次の場合:

_tar cvf /somedir/all.tar .
_

次に、これを名前でソートするには、次のようにする必要があります(GNU findおよびcpioと仮定):

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

ただし、ファイル名の間にサブディレクトリが配置されるという欠点があります。 finds -printf0を使用してディレクトリと深度情報を指定し、_sort -n_を使用して並べ替えを行うことができますが、これは、番号付きのファイルがディレクトリ内で並べ替えられる方法にも影響します。

上記が満足できない場合は、おそらく小さな[pythonに基づいたプログラムos.walk()]を使用して、完全な制御で必要な順序を生成できます(深さを最初に、拡張などに基づいて)ただし、そのルートをたどる場合は、cpioをドロップして、Pythonのtarモジュールを使用してtarfileファイルを書き出すこともできます。

2
Anthon