![如何动态连接两个文件并将结果引用为新文件?](https://linux22.com/image/50092/%E5%A6%82%E4%BD%95%E5%8A%A8%E6%80%81%E8%BF%9E%E6%8E%A5%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%E7%BB%93%E6%9E%9C%E5%BC%95%E7%94%A8%E4%B8%BA%E6%96%B0%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想连接两个文件,即staticEntries.dic和dynamicEntries.dic。正如名称所示,staticEntries.dic 的内容随着时间的推移保持不变(包含常用单词),但相反,dynamicEntries.dic 可能会随着时间的推移而改变(包含从数据库中提取的缩写)。在我的编辑器中,我想提供一个 mydict.dic,其中包含这两个文件的内容。当然,我可以通过 Shell 来完成此操作,但随后我必须替换 mydict.dic 文件中的dynamicEntries.dic 内容,然后才能将新版本的dynamicEntries.dic 连接到生成的mydict.dic。 -> 我想创建一个 mydict.dic 文件,其中包含连接其他两个文件的命令,但我不知道该怎么做。由于它不是由我的编辑器执行或调用的(我猜),所以我无法使用 bash 命令。
接下来是一个简单的例子:
staticEntries.dic 的内容
house
dog
horse
dynamicEntries.dic 的内容。该内容是基于数据库生成的,因此它会随着时间的推移而变化。
EGB38
PD
UH7ZT
mydict.dic 的追踪内容
house
dog
horse
EGB38
PD
UH7ZT
如果我通过 shell 进行该组合,如果生成了文件dynamicEntries.dic的新版本,我就会遇到问题:如何避免 mydict.dic 文件中的重复条目?因此,我想将串联命令放入一个文件中,并将其作为普通文件引用,我可以将其作为字典文件提供给编辑器。我不知道这是否可行,或者我是否必须采用另一种方法。
答案1
您可以编写一个位于命名管道后面的脚本,并在打开和读取时转储 staticEntries.dic 和dynamicEntries.dic 的内容。记下管道正在关闭并终止输出,直到它再次打开。
但是您必须让该脚本在后台运行,并记住在注销/登录或重新启动后再次启动它。
更重要的是,这不是 shell 编程新手的任务。
有时(通常),最简单的解决方案是最好的。
更简单的方法是创建一个 Makefile,将 mydict.dic 定义为依赖于其他两个文件,并记住在需要时运行 make 来更新它。或者只是一个 shell 脚本 - Makefile 的优点是您还可以从 cron 运行它,并且只有在任一源文件发生更改时它才会更新目标文件 (mydict.dic)。
例如:
#!/usr/bin/make -f
all: mydict.dic
mydict.dic: staticEntries.dic dynamicEntries.dic
cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
mv mydict.dic.tmp mydict.dic
这些行以制表cat
符mv
开头,而不是空格。
串联文件首先创建为临时文件,然后移动到位,因此用新文件替换旧文件是一个原子操作。这样做的目的是,每当您使用该文件时,您要么拥有完整的旧版本,要么拥有完整的新版本,但永远不会拥有新版本的部分版本。
如果任一源 .dic 文件位于不同的目录中,则需要指定文件的完整路径名。
答案2
如果动态字典已被修改,我将运行一个小 cronjob 来重新连接文件。首先,编写一个小脚本来监视文件的更改:
#!/usr/bin/env bash
while true; do
inotifywait -e modify path/to/dynamicEntries.dic
sort path/to/dynamicEntries.dic /path/to/staticEntries.dic |
uniq > mydict.dic.tmp
sleep 1
done
现在,将该脚本另存为dict.sh
或其他内容,使其可执行(chmod a+x dict.sh
)并创建一个在重新启动时启动该脚本的 crontab。运行crontab -e
并粘贴到这一行:
@reboot /path/to/dict.sh
现在,每次动态字典发生变化时,字典都会自动更新,而您无需手动运行任何内容。
答案3
在 shell 中连接文件很简单:
cat staticEntries.dic dynamicEntries.dic
这将在 上打印这两个文件的内容stdout
。如果要将结果重定向到新文件中,请执行以下操作:
cat staticEntries.dic dynamicEntries.dic > mydict.dic
但这可能不是您要找的......?我不得不说,我不太明白你想要解决的问题。
答案4
您可以更改称呼编辑的方式。假设您正在使用vi
,您可以创建一个 shell 脚本editmydictionary.sh
:
cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
vi mydict.dic.tmp
因此,每当您执行 时editmydictionary.sh
,您都在编辑这两个文件的最新版本。