与给定文件具有共同部分的文本文件

与给定文件具有共同部分的文本文件

我需要维护一组保存在目录中的纯文本文件,这些文件都有一个从另一个文件中提取的部分。示例如下:

文件:

/directory/textfile1 (every other file in the directory needs to "include" the
                      full contents of this file, each file can do so at a
                      different starting position; this file changes often      )
/directory/textfile2 ("includes" textfile1 after a few lines from the top       )
/directory/textfile3 ("includes" textfile1 as a header                          )
/directory/textfile4 ("includes" textfile1 as a footer                          )

更改 textfile1 后,我希望文件系统读取命中 textfile{2..4} 以返回包含 textfile1 中新内容的更新版本。

在 Web 服务器上,这可以通过传统的服务器端包含指令来解决。现在,在不运行前端服务的情况下我该如何做到这一点?

我可以创建一个符号链接,而不是指向另一个 inode,而是运行一些自定义代码并将 stdout 显示为文件的内容,就像定义自定义“重新分析点”一样?

例如,假设的“符号链接”将为文件 textfile3 运行此命令:

cat /directory/textfile1 /directory/textfile3_static

从而模拟存在一个静态文件,其内容取决于textfile1。

我正在寻找一种使用最少定制量的解决方案,而不是为特殊安装点或类似的东西编写自定义 FUSE 模块。

我可能在这里思考错误的方向,也许在每次修改 textfile1 时触发更新脚本替换占位符会更容易?如何在不轮询的情况下捕获该事件?

这里有一些示例文本文件:

内容:

/directory/textfile1:
--------------------------------------------------------------------------------
Ferma non stai sei come un ciclone
e non dormi mai
--------------------------------------------------------------------------------

/directory/textfile2:
--------------------------------------------------------------------------------
Juny tu hai un cervellone
quasi tutto sai
Ma quando fai un'invenzione
sono sempre guai
Ferma non stai sei come un ciclone
e non dormi mai
Il centauro Nico ami già
ma lui forse non lo sa
--------------------------------------------------------------------------------

/directory/textfile3:
--------------------------------------------------------------------------------
Ferma non stai sei come un ciclone
e non dormi mai
Il centauro Nico ami già
ma lui forse non lo sa

Come sempre insisterai
allora che pasticci tu di nuovo farai
--------------------------------------------------------------------------------

...等等。 :)

答案1

以某种方式将@polynomial 答案翻译为bash

#!/bin/bash

if [[ ! -e textfile2 ]]; then
  mkfifo textfile2
fi

while true; do
  (
    exec >textfile2
    cat textfile2-header
    cat textfile1
    cat textfile2-footer
  )
done

答案2

您可以使用命名管道来做到这一点。基本上,您可以将文本文件保存为“模板”和类似以下 perl 示例的脚本:

http://perl.active-venture.com/pod/perlipc-pipes.html

将“textfile3”作为管道打开,当它收到读取请求时,它将转储 textfile3 应包含的内容(可能通过读取 textfile3.template 并根据需要替换内容)。这将允许您动态更改内容,而无需更新多个文件并且只需最少的配置。

相关内容