web-dev-qa-db-ja.com

特定のファイルと共通のセクションを持つテキストファイル

ディレクトリに保存されたプレーンテキストファイルのセットを維持する必要があります。これらのファイルにはすべて、別のファイルから取得したセクションがあります。次に例を示します。

ファイル:

/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サーバーでは、これは従来のサーバーサイドインクルードディレクティブで解決されます。さて、フロントエンドサービスを実行せずにそれを行うにはどうすればよいですか?

別のiノードを指すのではなく、カスタムコードを実行し、カスタムの「再解析ポイント」を定義するように、ファイルのコンテンツとして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
--------------------------------------------------------------------------------

...エトセトラ。 :)

3
Robottinosino

どういうわけか@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
enzotib

名前付きパイプを使用してこれを行うことができます。基本的に、テキストファイルを「テンプレート」および次のPerlの例のようなスクリプトとしてどこかに維持します。

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

'textfile3'をパイプとして開き、読み取り要求を受け取ると、textfile3に含まれるべき内容をダンプします(おそらくtextfile3.templateを読み取り、必要に応じて内容を置き換えることによって)。これにより、複数のファイルを更新することなく、最小限の構成でコンテンツを動的に変更できます。

1
polynomial