ソートされた順序でファイルを圧縮するには?

ソートされた順序でファイルを圧縮するには?

ディレクトリに再帰的にアクセスする場合は、オペレーティングtarシステムのreaddir

ただし、場合によっては、ソートされたファイルをtarとして処理することをお勧めします。

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


この質問の目的に応じて、一般的なLinuxシステムのgnu-tarは問題ありません。

答え1

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

答え2

...を使用して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。出力は標準出力に移動します。シェルグローブは名前でソートされます。

会ったらパラメータリストが長すぎます。エラーは次のように変更されることがあります。

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

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

答え3

tarこれはそれ自体では実行できないため、適切にソートされたリストから作成する必要があります。原則として、tarオプションを使用できますが、-Tこのリストのファイル名がNULで終わるように指定する方法はありません。したがって、改行を含むファイル名がある場合、この問題が発生します(許可されています)。

より良いオプションは、cpioNULで終わるファイル名のリストを受け入れて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

サブディレクトリはファイル名の間にありますが、これには欠点があります。 s -printf0を使用してfindディレクトリと深さ情報を指定してソートすることができますが、sort -nこれは数字を含むファイルがディレクトリでソートされる方法にも影響します。

上記がうまくいかない場合は、小さなPythonプログラムを使用して必要なフルコントロール(深さ優先、拡張ベースなど)でソートを作成できますが、os.walk()このパスを使用すると次のようになります。 Pythonモジュールを使用してエクスポートcpioファイルを削除して作成します。tartarfile

関連情報