如何以排序顺序对文件进行tar处理?


10

如果tar是递归目录,则仅使用os的顺序readdir

但是在某些情况下,最好对已排序的文件进行tar处理。

对按字母顺序排序的目录进行压缩的好方法是什么?


注意,出于这个问题的目的,在典型的Linux系统上使用gnu-tar是可以的。



我看到了这一点,但是我不问如何设置顺序,而是想对它们进行排序。
ideaman42

另请参见unix.stackexchange.com/a/67018,以按名称对目录树进行排序。
斯特凡Chazelas

Answers:


17

对于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


8
--sort是在tar版本1.28中引入的。--preserve-order与这个问题无关。
mhsmith

我一直有tar: Exiting with failure status due to previous errors错误。@mhsmith
alper

3

使用zsh,而不是:

pax -w dir

采用:

pax -dw dir dir/**/*(D)

您可以对with的最新版本执行相同的操作bash -O globstar -O dotglob

pax -dw dir/**

或的最新版本 FIGNORE='@(.|..)' ksh93 -o globstar

pax -dw dir dir/**

pax是制作tar文件的标准命令。输出进入标准输出。Shell球按名称排序。

如果遇到Arg列表过长的错误,则可以更改为:

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

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


2

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并写出tarpython tarfile模块的文件。


1
--null指定-T接受以null结尾的字符串。
psusi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.