web-dev-qa-db-ja.com

フォルダをシンボリックリンクして特定のファイルを除外する方法

私は(残念ながら)サーバーの第一人者ではありませんが、LinuxとBSDについては十分な知識があります。 HLDS(ゲームサーバー)の複数のインスタンスをシンボリックリンクしようとしていますが、これを適切に実現するには、特定のフォルダーと構成ファイルを除外する必要があります。 HLDSは多くのmodを自動的にロードするため、この方法で行う必要があります。modを無効にする例外を設定しても、すべてのmodで機能するわけではありません。

だから基本的に私は欲しい:

/ home/user/hlds-install(基本インストール)
/home/user/server1
/home/user/server2
等...

次に、除外された構成/変更をサーバーディレクトリに手動で配置して、各サーバーを個別に構成できるようにします。

誰かがこれを行う方法を教えてもらえますか?おそらく、新しいターゲットを作成するたびにターゲットを変更して実行できるようにするための、ある種のbashスクリプトです。私にはかなりの数がありますので、それぞれに対して手動ですべてを行うことは絶対に選択肢ではなく、より賢く、難しくはありません!

ありがとう:)

5
Jarrod White

私はあなたが本当に「フォルダ内のすべてをシンボリックリンクする」という意味だと思います...

概念的には、次のようなものが必要です。

for each file in base folder not in exclude list
    create symlink in target folder pointing back to base folder
done

これを実現するためのbashロジックは次のようになります

#! /bin/bash

exclude=( "foo.conf" "bar.conf" )

for file in *; do
    for (( index = 0; index < ${#exclude[@]}; index++ )); do
        if [[ ${file} != ${exclude[${index}]} ]]; then
            ln -s ${file} ${target}/${file}
        fi  
    done
done

まだわからないと仮定すると、 Advanced Bash-Scripting Guide は、必要なグロブ(おそらくfind)とそれを関数(おそらく再帰的なもの)に変換する方法を理解するのに十分なはずです。 。

3
Andrew

xstow を(乱用)使用できます。このプログラムは、必要なものに近いシンボリックリンクのフォレストを作成するように設計されています。一部のファイルを除外するオプションはありませんが、ハッキングすることはできます。サーバーごとに:

  1. このサーバーから除外するファイルを作成します。内容は関係ありません。後でわかりやすくする必要があるため、すべてを1つの特定のファイルへのハードリンクにします。
  2. (要件でこれについて言及していませんが、簡単に適合させることができます。)これらのファイルのみを含む階層からのサーバー固有のコンテンツが必要なシンボリックリンクファイル。
  3. 基本インストールからのシンボリックリンクファイル。すでに存在するファイルをスキップします。
  4. 実際にこのサーバーから除外したいファイルを削除します。
 cd .../targets/server1 
 touch .exclude 
 for x infiles to exclude ; do mkdir -p "$(dirname" $ x ")"; ln .exclude "$ x"; done 
 xstow -d .../sources-t。 server1-specific-files 
 xstow -f -d .../sources-t。 base-install 
 find -samefile .exclude -exec rm {} +