Linux

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

  • April 25, 2018

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

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

  1. 僅刪除舊文件

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

引用自:https://unix.stackexchange.com/questions/358113