我需要一個命令來刪除超過 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 的指令
答案1
問題是您將-r
選項添加到rm
命令中。即使資料夾不為空,這也會刪除它們。
您需要分兩步驟執行此操作:
僅刪除舊文件:
find . -type f -mtime +31 -delete
要刪除任何舊資料夾,如果它們是空的,我們可以看一下這裡,並稍微調整一下:
find . -type d -empty -mtime +31 -delete
答案2
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
操作的結果,如果結果為空,我們就知道甚至沒有一個元素(檔案/目錄/連結/等)是新的,因此這個目錄。可以安全刪除。