问题描述
我只想将当前目录的文件添加/更新到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
的输出进行零分隔,并在下一个处理中将其作为零分隔的输入读取,以保留文件名。