2017-02-20 150 views
2

實際上我測試這個腳本bash腳本 - 刪除文件夾超過X天的除了一些和所有及其子文件夾/文件

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1/*" ! -path "/Path/Folder/NODELETE2/*" ! -path "/Path/Folder/NODELETE3/*" -exec rm -rf {} \; 

刪除所有文件/文件超過7天以上,除了NODELETE1文件夾,NODELETE2NODELETE3文件夾。

問題是,它顯然不工作,因爲它刪除了這些文件夾和裏面的所有文件。

這就是我想做的事:

/Path/Folder/NODELETE1/some files and folders 
/Path/Folder/NODELETE2/some files and folders 
/Path/Folder/NODELETE3/some files and folders 
/Path/Folder/AFOLDER/somefiles and folders 
/Path/Folder/ANOTHERFOLDER/somefiles and folders 
/Path/Folder/... 
/Path/Folder/FILE 
/Path/Folder/ANOTHERFILE 
/Path/Folder/... 

我想自動刪除所有文件和文件夾舊的那7天(如此FOLDERANOTHERFOLDER...FILEANOTHERFILE...)以便

/Path/Folder/NODELETE1/some files and folders 
/Path/Folder/NODELETE2/some files and folders 
/Path/Folder/NODELETE3/some files and folders 

腳本有什麼問題?

編輯的腳本建議:

#!/bin/bash 

while IFS= read -r -d '' dir 
do 

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could 
    # remove it and put your actual folder names. 

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue 

    # Suggest un-commenting the echo line below and comment rm to ensure 
    # you have only the folders you want to delete. 
    echo "$dir" 

    # rm -rf "$dir"  
done< <(find /Users/Username/Desktop/test/* -type d -mtime +7 -print0) 

爲了測試,我有:

/Users/Username/Desktop/test/NODELETE1 
/Users/Username/Desktop/test/NODELETE2 
/Users/Username/Desktop/test/NODELETE3 
/Users/Username/Desktop/test/YESDELETE 

和腳本路徑

/Users/Username/Desktop/TEST.sh 
+0

你可以試試'-not -path「/ Path/Folder/NODELETE1/*」'而不是'! -path「/ Path/Folder/NODELETE1/*」' – Inian

+1

只有我患有偏執狂,絕不會直接執行'rm -rf'作爲'find -exec'的參數嗎? :) – jm666

+0

@ jm666:同樣在這裏,多數民衆贊成爲什麼建議一個備用的專有名稱檢查 – Inian

回答

2

TL; DR修復:

而不是你的線,這樣做:

find /Path/Folder/* -type d -mtime +7 ! -path "/Path/Folder/NODELETE1" ! -path "/Path/Folder/NODELETE2" ! -path "/Path/Folder/NODELETE3" -exec rm -rf {} \; 

更詳細的解釋:

你行的型d部分搜索只目錄。但是你排除的是你的NODELETE目錄中的東西。這仍然意味着您的NODELETE目錄是rm -rf的目標,並且由於它們被遞歸刪除。

+1

它完美的作品! – DylanDog

1

逃離!作爲

\! -path 

,以確保它不會解讀爲模式

2

不是依靠find命令的核心utils的,我會建議讓bash照顧它(你已標記bash反正)至排除文件夾具有特定的名稱,

#!/bin/bash 

while IFS= read -r -d '' dir 
do 

    # This line actually halts the control from entering if 
    # dirname contains either of the three names below. You could 
    # remove it and put your actual folder names. 

    [[ $dir =~ ^(NODELETE1|NODELETE2|NODELETE3)$ ]] && continue 

    # Suggest un-commenting the echo line below and comment rm to ensure 
    # you have only the folders you want to delete. 
    # echo "$dir" 

    rm -rf "$dir"  
done< <(find /Path/Folder/* -type d -mtime +7 -print0) 
+0

它給了我這個錯誤'線17:語法錯誤附近意外的令牌'<'''/用戶/用戶名/桌面/測試。sh:第17行:''done < DylanDog

+0

@DylanDog:你是用bash解釋器設置的嗎? '#!/ bin/bash'在腳本的頂部? – Inian

+0

yes'#!/ bin/bash' – DylanDog

相關問題