能否完全在内存中使用tar创建归档文件?
能否完全在内存中使用tar创建归档文件?
当然可以!完全不用碰磁盘,让tar从标准输入读取文件名和内容,直接输出归档到标准输出是能做到的,核心是利用GNU tar的几个参数来实现这个需求。
你之前的思路是对的,但问题在于两次调用tar会覆盖同一个归档文件,而且没法把文件名和内容一次性传给tar。其实我们可以让tar把标准输入的内容当作指定文件名的文件,直接加入归档,全程都在内存里处理:
单个文件的情况
如果要创建一个包含file-name.txt(内容为Hello World)的归档,直接输出到stdout,可以用这条命令:
echo "Hello World" | tar czf - --add-file=- --transform='s/-/file-name.txt/'
解释一下参数:
czf -:c创建归档,z用gzip压缩,f -表示把归档输出到标准输出--add-file=-:告诉tar从标准输入读取内容,当作一个文件加入归档--transform='s/-/file-name.txt/':把tar默认给stdin内容分配的文件名-替换成你想要的file-name.txt
多个文件的情况
如果要一次性加入多个内存中的文件,我们可以用进程替换或者组合多个输入,比如:
tar czf - \ --add-file=<(echo "Content for file1.txt") --transform='s/.*\/tmp\..*/file1.txt/' \ --add-file=<(echo "Content for file2.txt") --transform='s/.*\/tmp\..*/file2.txt/'
这里用<(command)的进程替换,让tar把每个命令的输出当作一个临时数据流(完全在内存,不会写到磁盘),然后用--transform把临时数据流的默认名称替换成我们想要的文件名。
另一种灵活的方式(先传文件名再传内容)
如果你想先告诉tar文件名,再传递对应内容,也可以用--null配合参数构造null分隔的文件名列表,让tar按顺序读取stdin的内容:
printf '%s\0' "file-name.txt" | tar czf - --null -T - --read-full-records <(echo "Hello World")
不过这种方式对多文件的内容分隔要求更严谨,不如前面的方法直观。
需要注意的是,这些方法依赖GNU tar(大部分Linux发行版默认都是这个),如果是BSD tar或者其他tar实现,参数可能会有差异,但核心思路都是让tar从标准输入获取内容并指定归档内的文件名,全程不涉及磁盘文件。
备注:内容来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

