如何按排序顺序压缩文件?

如何按排序顺序压缩文件?

如果您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。输出转到标准输出。 shell glob 按名称排序。

如果你遇到参数列表太长错误,可以改为:

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

(但并非所有pax实现都支持-0)。

答案3

tar它本身无法做到这一点,因此您必须从正确排序的列表中创建它。原则上,您可以使用tar's -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并写出tar带有 python 模块的文件tarfile

相关内容