Bash

遞歸刪除特定目錄名稱下超過 2 天的所有文件

  • November 15, 2021

我寫了這個腳本:

#!/bin/bash
DAYSOLD="2"
users_dir="/users"
cd $users_dir
date >> cleanup.log;  du -h --max-depth=1 | sort -hr >> cleanup.log
find $users_dir -mtime +$DAYSOLD -type f -exec rm -v {} \;

我只想刪除“工作區”目錄下且超過 2 天的文件。這應該怎麼做?

/users/user1/workspace
/users/user2/workspace
/users/user3/workspace

感謝您的幫助。我很想學習如何做到這一點。

-mtime "+$days"選擇年齡(基於上次修改時間)向下舍入整數天數嚴格大於$days.

不會選擇 2 天 23 小時前的文件,-mtime +2因為它被認為是 2 天前的文件,不大於2.

所以你需要:

find "$users_dir"/*/workspace -mtime "+$(( DAYSOLD - 1 ))" -type f -delete

要刪除$DAYSOLDworkspace. $users_dir雖然你也可以這樣做:

find "$users_dir"/*/workspace '(' -mtime "$DAYSOLD" -o -mtime "+$DAYSOLD" ')' \
                  -type f -delete

刪除年齡(整數天數)為$DAYSOLD或大於$DAYSOLD.

-delete是一個非標準擴展,但在 GNU 中可用,find就像在 Ubuntu 上一樣,並且比使用-exec rm. -delete -print如果您想要已成功刪除的文件列表,您可以創建它。

還記得在攜帶變數之前引用你的變數並檢查退出狀態cd(cd -P -- "$users_dir" && exec du...)否則du如果cd失敗會在錯誤的目錄中執行。$users_dir另請注意子shell 的使用,否則如果是相對路徑,它將無法正常工作。把它寫成這樣實際上更有意義:

cd -P -- "$users_dir" || exit
du ...
find . ...

$users_dir(如果是符號連結會更一致)


¹ 嚴格來說,這至少是$DAYSOLD幾天前的事情,但考慮到比較是使用納秒精度完成的,並且需要幾百納秒才能開始find,這種區別幾乎無關緊要。

² 嚴格來說,如果workspace是一個非directory類型的文件,它仍然會被傳遞給find,並且如果該文件早於$DAYSOLD幾天(並且是 的正常文件-type f),它也會被刪除。您可以切換到zsh並添加(/)到模式以確保僅workspace考慮目錄類型的文件。不要/在下面遇到 ³ 那樣附加更嚴重的後果(例如何時/users/joe/workspace/bin或的符號連結/)。

³ 請注意,那裡遵循符號連結。因此,如果/users/joe是一個符號連結/,例如,它將刪除目錄中的舊文件/workspace

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