如何编写一个脚本来比较两个不同文件夹的文件夹/符号链接名称?

如何编写一个脚本来比较两个不同文件夹的文件夹/符号链接名称?

我需要帮助编写一个脚本来创建符号链接。这是我在后台运行的一个脚本。

#!/bin/bash
SOURCE="/home/$USER/www"
DEST="/var/www"
while true; do
    find $SOURCE -maxdepth 1 -type d -not -name "old.**" -exec ln -s -- {} "$DEST"/{} \;
    find $DEST -maxdepth 1 -type l -exec test ! -e {} \; -delete
sleep 30
done

现在我想让这个脚本执行更多的任务。

  • 忽略已链接的文件夹和带有“old.”前缀的文件夹
  • 如果主文件夹在 $SOURCE 中不可用,则从 $DEST 中删除符号链接。

请帮助我在此脚本中添加这些功能。谢谢。

答案1

我知道这可能比您预期的更麻烦,但我会将该-exec ...部分重写为一个单独的脚本,该脚本获取一个输入参数(要符号链接到的目录名),然后检查符号链接是否已经存在(例如if [ -h "$DEST/$1" ] ...),如果需要,检查它是否解析到正确的位置(例如if [ $(readlink $DEST/$1) == $SOURCE/$1 ] ...。如果两个条件都为真,则我们跳过该文件,否则将(重新)创建符号链接。

然后,您可以在 exec 类中像这样调用该脚本: find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;

另外几点:

  • find将替换的文件名{} 会包括$SOURCE:例如,在您的情况下,最终exec命令将如下所示:ln -s -- /home/user/www/public /var/www/home/user/www/public。使用 解决此问题basename

  • 在某些系统(OS X)上,$SRC 目录本身将包含在find找到的目录列表中。这可能不是您想要的。通过删除第一行输出find或添加-not -name $(basename $SOURCE)子句来解决此问题。

希望这可以帮助。

相关内容