我需要帮助编写一个脚本来创建符号链接。这是我在后台运行的一个脚本。
#!/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)
子句来解决此问题。
希望这可以帮助。