自动将目录文件符号链接到另一个目录

自动将目录文件符号链接到另一个目录

每当我向 中添加内容时~/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、、mkdirmv来测试解决方案。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(至少在我的操作系统中是这样的)。

启动/重新启动/重新加载守护进程并享受乐趣。

相关内容