Linux
刪除所有舊文件、文件夾和子文件夾的命令
我需要一個命令來刪除超過 31 天未更新的所有文件、文件夾和子文件夾。我試過這個
find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;
但是如果我有這樣的層次結構
. ├── old_sub_folder1 └── old_sub_folder2 ├── old_file └── old_sub_folder3 └── new_file
old_*
舊文件夾\文件在哪裡,new_file
是一個新文件。此命令將刪除所有內容。因為
old_sub_folder2
日期在new_file
創建後沒有更新。我需要一個不會刪除 old_sub_folder2/old_sub_folder3/new_file 的命令
問題是您將
-r
選項添加到rm
命令中。這將刪除文件夾,即使它們不為空。您需要分兩步執行此操作:
- 僅刪除舊文件:
find . -type f -mtime +31 -delete
2. 要刪除任何舊文件夾,如果它們是空的,我們可以在這裡查看一下,並稍微調整一下:
find . -type d -empty -mtime +31 -delete
find . -type d ! -name . -mtime +31 -exec sh -c ' case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in "" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;; esac ' {} {} \;
我們從目前目錄啟動
find
並僅查看directories
自過去 31 天以來未更新的目錄。在這些目錄中的每一個中,我們依次潛入並尋找不超過 31 天的任何內容,找到它後,我們會回顯一個虛擬字元並修剪任何前向搜尋(理想情況下,我們應該通過以下方式終止我們的搜尋-quit
但這不是POSIX
因此我們滿足於-prune
)。然後我們尋找這個
find
操作的結果,如果結果是空的,我們知道甚至沒有一個元素(文件/目錄/連結/等)是新的,因此這個目錄。可以安全刪除。