每当我向 中添加内容时~/config/
,我都希望将其符号链接到~
。我不想ln -s
每次都运行。
答案1
有iwatch
一个实用程序可以做到这一点。在我的 Ubuntu 中,我安装了iwatch
获取它的包。它可以用作守护进程或命令行工具。
我无法保证以下解决方案万无一失且写得很好。请将它们视为概念证明。
命令行
在我的测试中,我无法让其iwatch
自身的单个实例在创建文件时执行一个操作,而在删除文件时执行另一个操作。也许你可以以某种方式做到这一点。我决定解析其输出,然后决定(case
语句)要做什么。运行此命令:
cd ~/config
iwatch -e create,moved_to,delete,moved_from -c "printf '%s %s\n' %e %f" ./ |
while read -r e f ; do
f="$(basename "$f")"
case $e in
*IN_CREATE|*IN_MOVED_TO)
ln -s "config/$f" "../$f"
;;
*IN_DELETE|*IN_MOVED_FROM)
test -L "../$f" && rm "../$f"
esac
done
在另一个控制台中使用touch
、、mkdir
等mv
来测试解决方案。rm
~/config
笔记:
- 为新文件/目录创建符号链接,当目标被删除时它们也会被删除;
mv
也包括在内。 foo bar
即使对于像或 这类有点麻烦的名称,这对我来说也很有效a"b
。- 在创建期间:如果已经有一个对象
~/
占用该名称,则不会创建符号链接来覆盖它 - 不会丢失数据。 - 删除过程中:具有正确名称的符号链接无论指向何处都会被删除,而非符号链接则会因为 而保持完整
test -L …
。
守护进程
守护进程iwatch
读取其配置文件,您可以告诉它要做什么。我不仅在那里定义两个不同的操作时遇到了问题,而且还转义了配置文件中的一些字符。最简单的解决方案是调用 bash 脚本来完成这项工作。
开始之前,请注意:
- 路径应该是绝对的,修改它们以适合您的情况。
- 还
USERNAME
需要在配置文件和脚本中进行修改。
/etc/iwatch/iwatch.xml
这是在以下操作之前粘贴到配置文件(在我的操作系统中)的代码片段</config>
:
<watchlist>
<title>symlinks</title>
<contactpoint email="USERNAME@localhost" name="USERNAME"/>
<path type="single" events="create,moved_to,delete,moved_from" alert="off" exec="/home/USERNAME/bin/link_config %e %f">/home/USERNAME/config</path>
</watchlist>
(如果有的话,您可能想要删除默认watchlist
部分。)
脚本的路径是/home/USERNAME/bin/link_config
。这是快速而粗糙的脚本:
#!/usr/bin/env bash
p="/home/USERNAME"
e="$1"
f="$(basename "$2")"
case "$e" in
*IN_CREATE|*IN_MOVED_TO)
ln -s "config/$f" "$p/$f"
;;
*IN_DELETE|*IN_MOVED_FROM)
[ -L "$p/$f" ] && rm "$p/$f"
esac
我认为如果你省略星号 ( *
) 并保留空白IN_CREATE
等,那么脚本将忽略在 中创建的目录/home/USERNAME/config
;也许这是你更喜欢的。这也适用于命令行版本。
使脚本可执行:
chmod u+x /home/USERNAME/bin/link_config
根据需要设置其他权限。守护进程无论如何都会运行它root
(至少在我的操作系统中是这样的)。
启动/重新启动/重新加载守护进程并享受乐趣。