利用Linux find刪除特定时间的文件

本文介绍了如何利用Linux的find命令查找并删除三个月前的日志文件,以释放磁盘空间。通过指定mtime参数,可以轻松找到并删除指定时间范围的文件。最终解决方案为使用`find . -mtime +90 -type f -delete`来删除距今90天前的日志,确保系统只保留最近三个月的log资料。

利用Linux find刪除特定時間戳記的檔案

最近工作上有個需求,需要在 server 下系統時刪除3個月之前的 log 資料,起因是某天在下系統的時後,op同仁打電話過來表示磁碟空間已滿,因此系統出現異常。主機每天都會紀錄每隻process的一些log,但系統內也沒有寫排程去刪除,因此就空間滿了。

達成需求的功能 : 保留三個月內的log,刪除三個月前的資料

要達到上述提到的需求,流程大致上需要這麼處理

找尋檔案的指令
藉由找尋檔案的指令,看有沒有參數可以來限定每個時間範圍的檔案
找到檔案後刪除這些資料
起初我還在思考是不是要寫一隻shell 取得今天的時間然後在去爬檔案目錄什麼的blablabla……

後來強大主管提示我去 man page 看一下 find 的相關用法

讓我們來看看 find 的基本用法吧!!!

查找當前目錄和子目錄下的所有檔案

find .
當前目錄下查找所有.log的檔案(忽略大小寫 -iname)

find ./ -name “*.log”
接下來 find 也有對應時間戳記查找的參數,用來指定檔案時間範圍

-mtime/mmin n指定檔案的最後修改時間(modification time),單位為天/分鐘。

-atime/amin n指定檔案的最後存取時間(access time),單位為天/分鐘。

-ctime/cmin n指定檔案狀態相關資訊最後修改的時間(status time),單位為天/分鐘。

根據需求,我們要找的是修改時間 (-mtime),並且以天為單位的,會有以下三種情境

  • find . -mtime 10 : 找尋 剛好10天之前 被修改的檔案

  • find . -mtime -10 : 找尋 近10天內 被修改的檔案

  • find . -mtime +10 : 找尋 10天之前被修改的檔案

  • find . -mtime +10 -mtime -20 : 找尋10天以上20天以內的資料

此次的需求是要找當前之料夾下,距離今日90天以前的資料

find ./ -mtime +90
這邊我們已經成功找到當前目錄下修改時間 90 天以前的檔案了
最後一步把這些檔案刪除就可以大公告成了 😃

使用 find . -exec

find ./ -exec cmd {} ;
使用 {} 用在 -exec 结合使用把找尋到的檔案,替换成相應的文件名。

find ./ -type d -mtime +90 -prune -exec rm -rf {} ;
後來發現如果要刪除的話,其實也可以直接使用 -delete,但-exec 就是比較彈性可以做更多變化,我們這邊就偷懶使用 -delete 吧!

最終的寫法如下
find ./ -mtime +29 -delete
這次的紀錄也是寫個筆記給腦容量不大的自己,成功完成利用 find 指令搭配上時間戳記 -mtime n 在用 -delete 把時間戳記條件下的檔案找出來並刪除

### Linux 中批量删除特定文件名的方法 在 Linux 系统中,可以利用 `find` 命令结合 `-exec` 或者管道操作符来完成批量删除特定名称的文件的任务。以下是几种常见的方式: #### 使用 `find` 和 `-exec` 组合 通过指定目标路径、文件类型以及文件名模式,可以精确地定位要删除文件,并执行删除操作。 ```bash find /path/to/directory -type f -name "specific_pattern*" -exec rm -f {} \; ``` - `/path/to/directory`: 替换为目标目录的实际路径。 - `-type f`: 指定查找的对象为普通文件。 - `-name "specific_pattern*"`: 定义文件名匹配规则,例如 `"file_*.txt"` 将会匹配所有以 `file_` 开头且扩展名为 `.txt` 的文件[^2]。 - `-exec rm -f {} \;`: 对每一个找到的结果执行删除命令,其中 `{}` 是占位符代表当前查找到的文件,`\;` 表示结束该指令。 此方式适用于需要递归遍历多层子目录的情况。 #### 利用通配符直接删除 如果所有的目标文件都位于同一个目录下而无需深入子目录,则可以直接进入对应目录并通过简单的 `rm` 加上合适的通配符来进行清理工作。 ```bash cd /target/directory/ rm -f specific_prefix* ``` 这里需要注意的是,这种方式不会涉及任何子目录内的同类型文件[^5]。 #### 结合 Shell Script 实现更复杂的逻辑 对于一些更加复杂的需求比如动态生成符合条件的新旧名字映射关系后再做相应处理等情况可能就需要编写小型脚本来辅助完成了。下面给出一个例子展示如何基于某些条件重命名再移除原档: ```bash #!/bin/bash for file in $(ls *.log); do mv "$file" "${file%.log}.bak" done && \ find . -maxdepth 1 -type f -name "*.log" -delete ``` 上述脚本首先把所有`.log`结尾的日志文档转换成备份形式即改为`.bak`,之后再次调用`find`仅限于当前层级(`-maxdepth 1`)找出剩余未改动过的原始日志予以清除掉[^4]。 --- ### 注意事项 无论采取哪种方案,在实际运行之前建议先打印出即将影响到的具体项目列表确认无误后再真正施行破坏性的动作以免造成不可逆的数据丢失风险。 ```bash # 测试阶段查看哪些会被删掉而不真的去做 find /example/path -type f -name '*.tmp' -print ``` 只有当验证结果满意时才加上真正的删除行为参数继续下一步骤。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值