ディレクトリを再帰的にtar
する場合、OSのreaddir
からの順序を使用するだけです。
しかし、場合によっては、ファイルをtarでソートしておくと便利です。
アルファベット順にソートされたディレクトリをtarする良い方法は何ですか?
この質問の目的のために、典型的なLinuxシステムのgnu-tarは問題ありません。
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
も確認する必要があります。
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
_をサポートしているわけではありません)。
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
_
ただし、ファイル名の間にサブディレクトリが配置されるという欠点があります。 find
s -printf0を使用してディレクトリと深度情報を指定し、_sort -n
_を使用して並べ替えを行うことができますが、これは、番号付きのファイルがディレクトリ内で並べ替えられる方法にも影響します。
上記が満足できない場合は、おそらく小さな[pythonに基づいたプログラムos.walk()
]を使用して、完全な制御で必要な順序を生成できます(深さを最初に、拡張などに基づいて)ただし、そのルートをたどる場合は、cpio
をドロップして、Pythonのtar
モジュールを使用してtarfile
ファイルを書き出すこともできます。