当脚本需要未压缩时如何使用压缩存档

当脚本需要未压缩时如何使用压缩存档

我目前正在开发一个调用脚本的程序,该程序将 NCBI Blast 数据库从 BLASTDB 格式转换为 FASTA 格式。该脚本通常期望在未压缩的 BLASTDB 数据库的目录中运行,并使用 -db 选项来明确应转换哪个数据库(由多个具有相同名称但结尾不同的文件组成)。

因为我在服务器上的存储空间非常有限,所以我只想将数据库保存在压缩存档中,所以我的问题是:有没有办法在该存档中使用该脚本或者是否可能(也许通过 bash 重定向?)直接将未压缩的存档流式传输到该脚本中?

提前致谢 :)

答案1

您可以使用以下命令挂载您的存档保险丝档案

mkdir /mnt/some-directory
fuse-archive your-archive.tar.gz /mnt/some-directory

但是您可以将存档内容重新打包到 SquashFS 文件中,并且可能会获得更好的性能,因为与 tar 不同,SquashFS 是一个专为随机访问而设计的压缩文件系统。使用tar2sqfs工具重新包装:

zcat your-archive.tar.gz | tar2sqfs -c xz -b 1048576 mountable-archive.squashfs

然后,以 root 身份:

mount -t squashfs mountable-archive.squashfs /mnt/some-directory

或作为普通用户,使用挤压保险丝

squashfuse mountable-archive.squashfs /mnt/some-directory

以 root 身份安装的 SquashFS 将提供所有三种方法的最佳性能。


在安装的目录中,/mnt/some-directory您将找到存档的内容,并且可以运行任何脚本。但请注意,无论如何这都会是只读目录。如果您需要写入此目录(例如,创建或更新文件),则需要使用overlayfs(或任何其他覆盖安装程序,例如aufs)添加另一个安装:

mkdir /mnt/upper
mkdir /mnt/work
mkdir /mnt/readwrite-directory

mount -t overlay -o upperdir=/mnt/upperdir,lowerdir=/mnt/some-directory,workdir=/mnt/work mountable-archive-rw /mnt/readwrite-directory

然后在这个范围内工作/mnt/readwrite-directory。它填充了存档中的所有对象,但它是读写的;任何新文件或更新都将写入/mnt/upper,而/mnt/some-directory是上一步中的只读squashfs 或fuse-archive 安装点。

答案2

不。相关文件明确指出:

下载的压缩文件必须使用gzip或其他解压工具进行充气。然后可以使用 Unix/Linux 上的 tar 实用程序或 Windows 和 Macintosh 平台上的 WinZip 和 StuffIt Expander 从生成的 tar 文件中提取 BLAST 数据库文件。

如果这实际上是一个脚本,您可以使用以下方法绕过它流程替代如果你的 shell 支持它:

command <(zcat file.gz)

这将允许像未压缩一样command进行处理。file.gz不幸的是,它不是您的脚本使用数据库,而是blast可执行文件,并且期望它被解压缩,因为您没有将数据库文件作为参数传递,所以您无法绕过它。


也就是说,尼基塔·基普里亚诺夫的建议sqshfs 的意义非常重大!

相关内容