題 使用子目錄刪除超過x天的文件的Bash腳本


我正在嘗試刪除大量超過x天的文件。

現在我有一個腳本來做到這一點

find /path/to/files* -mtime +10 -exec rm {} \; 

但這也將刪除子目錄。有很多文件夾,但我想保留它們,並刪除所述文件夾中超過10天的文件。

有沒有辦法做到這一點?


36
2018-01-05 16:18


起源




答案:


type 過濾結果的選項

find 接受 type 例如,僅選擇文件的選項。

find /path/to/files -type f -mtime +10 -delete

忽略 -delete 顯示刪除的內容,一旦驗證完畢,請繼續執行完整命令。

那隻會在文件而不是目錄上運行。使用 -type d 對於反向,只列出與您的參數匹配的目錄。


其他選項

你可能想讀 man find,因為將來可能還需要更多選項。例如, -maxdepth 允許您僅將找到的項目限制在特定深度,例如 -maxdepth 0 不會遞歸到子目錄。

一些評論

  • 我想知道該命令將如何刪除文件夾,因為您無法刪除文件夾 rm 只要。你需要 rm -r 為了那個原因。

  • 也, /path/to/files* 令人困惑。你的意思是 /path/to/files/ 或者您希望通配符擴展為多個文件和文件夾名稱?

  • 放在 {} 用單引號,即 '{}' 避免shell解釋替換文件/目錄名,就像我們用反斜杠保護分號一樣。


50
2018-01-05 16:23



那麼/ path / to / files /裡面有很多文件夾我實際上想運行mtime +10 -exec rm到每個文件夾但保留文件夾本身,基本上我想實現的是刪除所有的超過10天的文件並保留所有文件夾。我是一個新手抱歉的新聞:) - JoyIan Yee-Hernandez
好吧,你去吧:)做一個 find /path/to/files* -type f -mtime +10 並看看它會輸出什麼。 - slhck
是的,如果有疑問,不要這樣做 -exec,只要先看看它發現了什麼。 - Rob
@ JoyIanYee-Hernandez您也可以使用 -delete 論證 find,刪除所有文件和文件夾,後者只有空。這意味著 -depth,即深度優先搜索。 - Daniel Beck♦
@Kreker然後你需要添加 -mindepth 1 排除父目錄。 - slhck


正如之前的答案(兩者都是+1)一樣,訣竅是使用 -type f 謂語。

請注意,而不是 -exec rm '{}' 你也可以用 -delete 謂語。但不要這樣做。同 -exec rm '{}' 你可以(而且應該)先做 -exec echo rm '{}' 驗證這確實是你想要的。之後重新運行命令而沒有 echo

運用 -delete 更快(沒有額外的 fork() 和 execve() 對於每個文件),但這是有風險的,因為 -delete 也作為一個條件,所以:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

但如果你只交換參數:

# delete ALL files
find . -type f -name '*.tmp' -delete

如果你需要的話 find 和 rm 為了更快地處理大量文件,請查看 find ... | xargs ... rm UNIX習語。


5
2018-01-05 17:33



我認為你的最後兩個例子完全一樣,可能要糾正一下! - slhck


您可以使用find命令輕鬆完成此操作

$ find -type f

這會將結果限制為類型文件


1
2018-01-05 16:23





我正在努力使用上面提供的腳本以及其他一些腳本來解決這個問題,特別是當文件和文件夾名稱有換行符或空格時。

最後偶然發現了tmpreaper,到目前為止我們的工作效果還不錯。

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

原始來源 鏈接 

有像test這樣的功能,它以遞歸方式檢查目錄並列出它們。 能夠在刪除時刪除符號鏈接,文件或目錄以及特定模式的保護模式


1
2018-02-20 11:26





加快命令使用 '+' 代替 \;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

這將運行 rm 只有一次在最後,而不是每次找到一個文件。
rm 如果你因為命令行長度限製而擁有大量文件,可能會運行多次,但這仍然和使用時一樣快 -delete


0
2018-01-05 17:56





rm -f find /path/to/files -type file -mtime -5

這將刪除在5天內修改的文件

rm -f find /path/to/files -type file -mtime +5

這將刪除在5天之前修改的文件

在查找之前使用`,在結束之後使用5。


0
2017-09-30 09:49