如果您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
尽管子目录放置在文件名之间,但这有一个缺点。您可以使用find
s -printf0 来指定目录和深度信息并进行排序,sort -n
但这也会影响带有数字的文件在目录中的排序方式。
如果上面的内容不令人满意,您可能可以使用一个小的 python 程序来os.walk()
生成您想要的完全控制的排序(深度优先,基于扩展等),但是如果您走这条路,您不妨删除cpio
并写出tar
带有 python 模块的文件tarfile
。