ディレクトリに再帰的にアクセスする場合は、オペレーティング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で終わるように指定する方法はありません。したがって、改行を含むファイル名がある場合、この問題が発生します(許可されています)。
より良いオプションは、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
サブディレクトリはファイル名の間にありますが、これには欠点があります。 s -printf0を使用してfind
ディレクトリと深さ情報を指定してソートすることができますが、sort -n
これは数字を含むファイルがディレクトリでソートされる方法にも影響します。
上記がうまくいかない場合は、小さなPythonプログラムを使用して必要なフルコントロール(深さ優先、拡張ベースなど)でソートを作成できますが、os.walk()
このパスを使用すると次のようになります。 Pythonモジュールを使用してエクスポートcpio
ファイルを削除して作成します。tar
tarfile