如何編寫一個腳本來比較兩個不同資料夾中的資料夾/符號連結名稱?

如何編寫一個腳本來比較兩個不同資料夾中的資料夾/符號連結名稱?

我需要幫助編寫腳本來創建符號連結。這是我一直在後台運行的腳本。

#!/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

現在我希望這個腳本能夠執行更多任務。

  • 忽略已連結的資料夾和帶有「舊」的資料夾。字首
  • 如果主資料夾在 $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)子句來解決此問題。

希望這可以幫助。

相關內容