我不是服务器专家(不幸的是),但对 Linux 和 BSD 有相当的了解。我试图符号链接 HLDS(游戏服务器)的多个实例,但需要排除某些文件夹和配置文件才能正确实现这一点。我需要这样做,因为 HLDS 会自动加载许多模组,而设置例外以禁用所有模组并不适用。
所以基本上我想要:
/home/user/hlds-install(基本安装)
/home/user/server1
/home/user/server2
等...
然后能够手动将我排除的任何配置/修改放入服务器目录,以便可以单独配置每个服务器。
有人能告诉我怎么做吗?也许是某种 bash 脚本,这样每次我想创建一个新的时,我只需更改目标即可运行它。我有相当多的工作要做,所以为每个工作手动完成整个工作绝对不是一个选择,我完全赞成更聪明地工作,而不是更努力地工作!
谢谢 :)
答案1
我认为你真正的意思是“文件夹内的所有内容的符号链接”......
从概念上讲,你想要的是类似这样的东西:
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
假设你还不知道,高级 Bash 脚本指南应该足以让您弄清楚您想要什么通配符(也许find
)以及如何将其转换为函数(也许是递归函数)。
答案2
你可以滥用克斯托。该程序旨在填充符号链接森林,这与您想要的非常接近。它没有排除某些文件的选项,但您可以破解它。对于每个服务器:
- 创建您想要的文件排除来自此服务器。内容并不重要,只要事后容易分辨即可,因此我们将使它们全部硬链接到一个特定文件。
- (您没有在要求中提到这一点,但很容易适应。)符号链接文件必须具有来自仅包含这些文件的层次结构中的服务器特定的内容。
- 来自基础安装的符号链接文件。跳过任何已存在的文件。
- 删除我们实际上想要从该服务器中排除的文件。
cd .../目标/服务器1 触摸.排除 对于 x要排除的文件; 执行 mkdir -p "$(dirname "$x")"; ln .exclude "$x"; 完成 xstow -d .../sources -t . server1 特定文件 xstow -f -d .../源-t. 基本安装 查找 -samefile.exclude -exec rm {} +