刪除所有舊文件、資料夾和子資料夾的命令

刪除所有舊文件、資料夾和子資料夾的命令

我需要一個命令來刪除超過 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命令中。即使資料夾不為空,這也會刪除它們。

您需要分兩步驟執行此操作:

  1. 僅刪除舊文件

    find . -type f -mtime +31 -delete

  2. 要刪除任何舊資料夾,如果它們是空的,我們可以看一下這裡,並稍微調整一下:

    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操作的結果,如果結果為空,我們就知道甚至沒有一個元素(檔案/目錄/連結/等)是新的,因此這個目錄。可以安全刪除。

相關內容