Bash
刪除目錄,除非由符號連結指向
我有以下目錄結構。我需要找到一個名為的文件
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
測試是非標準的,但由bash
shell 實現,它在解析符號連結後測試兩個路徑名是否引用同一個文件(或本例中的目錄)。為了安全起見,實際刪除已被註釋掉。
rm
您應該在啟用該命令之前對之前備份的數據進行測試。要刪除子目錄,無論它們是否包含名為
log.xml
的內容,請刪除-e
測試,以便if
語句看起來像if ! [ "$dirpath" -ef "$topdir"/ln/app ]; then printf 'Would remove "%s"\n' "$dirpath" # rm -rf "$dirpath" fi