複数のファイルを1つのファイルのように参照する方法

[code]

    $ ls
    hoge.text fuga.text piyo.text all.text
    $ cat hoge.text
    hoge
    $ cat fuga.text
    fuga
    $ cat piyo.text
    piyo
    $ cat all.text
    hoge
    fuga
    piyo
    $ echo hoge >> hoge.text
    $ cat all.text
    hoge
    hoge
    fuga
    piyo
    
[/code]

こういうことって可能ですか？




ええ、まぁ、できなくはないですよ。ただ、以下に説明する方法で納得していただけるどうかは、、分かりませんが。

Linux OS にはファイルシステムで発生するイベントを選択的に感知するための API が提供されています。`inotify`
と呼ばれていますが、これを使ってみます。

まずは inotify 関連のパッケージをインストールします。Ubuntu Linux の場合は `inotify-tools` がそれに当たります。

[code]

    $ sudo apt-get install inotify-tools
    
[/code]

それでは例として、`$HOME/tmp` に対象のファイルが置いてあるとします。

[code]

    $ cd $HOME/tmp
    $ ls
    fuga.text  hoge.text  piyo.text
    
[/code]

次に以下のシェルスクリプトを実行します。

**update.sh**

[code]

    #!/bin/bash
    
    target_dir=$HOME/tmp
    files=(fuga.text hoge.text piyo.text)
    all=all.text
    
    while inotifywait -qq -e modify @"$all" "$target_dir";
    do
      (cd "$target_dir" && cat "${files[@]}" > "$all")
    done
    
[/code]

[code]

    $ ./update.sh &
    
[/code]

では実際にファイルを変更してみます。

[code]

    $ cd $HOME/tmp
    $ echo hoge >> hoge.text
    $ cat all.text
    fuga
    hoge
    hoge
    piyo
    
[/code]

スクリプト内の `inotifywait` コマンドは `$HOME/tmp`
ディレクトリ内のファイルが変更されるのを待ちます。ただし、`$HOME/tmp/all.text` を除いて、です(`@"$all"`)。

`$HOME/tmp` ディレクトリ内には上記のファイルのみが存在することが条件です。他にファイルがある場合には `inotifywait`
コマンドに対象ファイルのみを指定することになりますが、具体的な指定方法は `inotifywait(1)` を参照して下さい。

