Bash

刪除目錄,除非由符號連結指向

  • February 11, 2022

我有以下目錄結構。我需要找到一個名為的文件log.xml所在的目錄並完全刪除它們,除了特定符號連結指向的目錄。

例如,/dir1/main/app1/v004/and/dir1/main/app2/v004/log.xml由符號連結指向,因此不應刪除它們。

除了符號連結指向的目錄之外,如何刪除目錄而不找到log.xml.

你能幫助解決這個問題嗎?

/dir1/main/app1/v001/
/dir1/main/app1/v002/log.xml
/dir1/main/app1/v003/log.xml
/dir1/main/app1/v004/log.xml
/dir1/main/app1/v005/log.xml
/dir1/ln1/app -> /dir1/main/app2/v004

/dir1/main/app2/v001/
/dir1/main/app2/v002/log.xml
/dir1/main/app2/v003/log.xml
/dir1/main/app2/v004/log.xml
/dir1/main/app2/v005/log.xml
/dir1/ln2/app -> /dir1/main/app2/v004

假設您要刪除目錄的所有子目錄,app除了v001(不包含log.xml)和v004(由符號連結指向):

for topdir in /dir1 /dir2; do

   for dirpath in "$topdir"/main/app/*/; do
           if [ -e "$dirpath/log.xml" ] && ! [ "$dirpath" -ef "$topdir"/ln/app ]
           then
                   printf 'Would remove "%s"\n' "$dirpath"
                   # rm -rf "$dirpath"
           fi
   done

done

外部循環用於遍歷兩個最頂層的目錄/dir1/dir2(您可能希望在/dir[12]此處用作通配模式)。頂級目錄的名稱保存在topdir變數中。

內部循環遍歷 under 、 under 的app子目錄$topdir。如果子目錄包含稱為log.xml(第一個測試,with -e)的東西,並且如果該目錄沒有被"$topdir"/ln/app符號連結指向(第二個測試,with -ef),那麼它可能會被刪除。

-e測試是對給定路徑名是否存在的標準測試。該-ef測試是非標準的,但由bashshell 實現,它在解析符號連結後測試兩個路徑名是否引用同一個文件(或本例中的目錄)。

為了安全起見,實際刪除已被註釋掉。rm您應該在啟用該命令之前對之前備份的數據進行測試。

要刪除子目錄,無論它們是否包含名為log.xml的內容,請刪除-e測試,以便if語句看起來像

if ! [ "$dirpath" -ef "$topdir"/ln/app ]; then
       printf 'Would remove "%s"\n' "$dirpath"
       # rm -rf "$dirpath"
fi

引用自:https://unix.stackexchange.com/questions/689908