linux - (Linux) 将多个文件作为一个文件读取,而无需先将 block 复制到新文件

标签 linux io named-pipes fuse

(Linux)手头的问题如下:

假设我们有 foo_1foo_2 实际上是 foo 文件的 2 个 block ,例如命令:

cat foo_1 foo_2 >foo

我希望系统能够将 {foo_1 + foo_2} 视为单个 foo 文件而不必先复制它使用上面的命令。

根据您用来读取 {foo_1 + foo_2] 的命令,假设您想要一个 md5sum,您可以只使用命名管道,它提供了该功能。

你会这样做:

mkfifo my_named_pipe
cat foo_1 foo_2 >my_named_pipe &
md5sum my_named_pipe

有效!

但命名管道有一个很大的限制:所有访问必须是顺序的(无查找),因为它基本上是一个管道。

因此这种“命名管道”方法不是“将多个文件读取为一个虚拟的单个文件”。

在下面的示例中确实适用于 md5sum,因为 md5sum 只需要顺序读取文件。 现在,如果该文件是一个 rar 文件或您想要使用 VLC 读取的视频,或者您想要挂载并进行随机访问的 ISO,那么这将失败,因为这些软件需要非顺序读取。

问题: 因此,在调用 calvary 之前,我的意思是为自己编写一个 fuse 文件系统,它将执行我上面描述的操作以节省宝贵的 I/O 和空间,我想知道您是否听说过这样做的通用方法。

我想到的是这样的:

fuseVirtualFile mountpoint foo foo_1 foo_2

那会显示挂载点下的“虚拟文件”foo,所以挂载点/foo

这个“虚拟文件”将是 foo_1 和 foo_2 的只读串联,无需实际执行写入 I/O,从而节省时间、磁盘空间和 SSD 磨损!

最佳答案

所以,既然它显然不存在,我就创造它吧!

看:mfs

这是一个 fuse 文件系统,可以按照我的问题进行操作,即“将多个文件虚拟合并为一个文件”。

然后就可以访问(只读)合并后的文件,就好像它实际上已通过 cat 命令合并到一个文件中一样。

如问题中所述,这仅在您需要随机读取访问时才有用,因为流访问可以通过命名管道完成。

这是:https://github.com/Bylon/mfs

尽情享受吧!

关于linux - (Linux) 将多个文件作为一个文件读取,而无需先将 block 复制到新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45552165/

相关文章:

c++ - Windows 与 Linux GCC argv[0] 值

读取不同编码的Rdata文件

java - 通过 JNI 做一些事情是不是个好主意?

c# - 如何在 .NET 3.5 中通过 NamedPipe 发送对象?

java - hs_err_pid.log 中的 "Events"是什么?

linux - 在 tcsh 中定义 shell 环境变量

.net - IO.FileNotFoundException 但文件应该存在

java - 对于在 Java 中并行应用 MD5 哈希到一组文件的行为变化是否有解释?

common-lisp - SBCL 运行程序 (Stanford Parser) 或 Unix 中的重定向 I/O

sql-server - 在客户端计算机上配置 SQL Native Client ODBC?