仅将当前目录中的文件添加到.7z文件中,而无需递归目录

问题描述

我只想将当前目录的文件添加/更新到archive.7z中,而不必递归到较低目录中。可以,但是由于每个文件的初始化都很慢:

find -maxdepth 1 -type f | while read f;do 7za a ~/archive.7z "$f" ; done

这也有效,并且速度更快,但是不确定带有空格和其他有问题字符的有问题文件名的防弹性:

find -maxdepth 1 -type f -print0 | xargs -r0 7za a ~/archive.7z --

应该没有更优雅的方式了吗?与-T -命令中的tar类似。我目前在Ubuntu16上使用7za版本9.20。像下面这样的变体失败了,它们开始递归到我不想要的较低目录中:

7za a -r- ~/archive.7z .
7za a -r- ~/archive.7z ./
7za a -r- ~/archive.7z *
7za a -r- ~/archive.7z -- *.*
7za a -r- ~/archive.7z -- "*"
7za a -r0 ~/archive.7z -- *.*

解决方法

find . -maxdepth 1 -type f -exec 7z a archive.7z {} +

通过这种方式,您可以调用一个7z进程(与语法-exec {} \;相反),而且这种过程有望很快。实际上,在引发第二个过程之前,它将使用最多允许的参数。


此外,关于您的文件名查询。 while循环是不可接受的。 find -print0 | xargs -0又好又快。通常,您必须对find的输出进行零分隔,并在下一个处理中将其作为零分隔的输入读取,以保留文件名。