递归删除特定目录名下超过 2 天的所有文件

递归删除特定目录名下超过 2 天的所有文件

我写了这个脚本:

#!/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 {} \;

我只想删除“workspace”目录下超过 2 天的文件。这应该怎么做呢?

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

谢谢你的帮助。我很想学习如何做到这一点。

答案1

-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是一个非标准扩展,但可以在findUbuntu 上的 GNU 中使用,并且比使用-exec rm.-delete -print如果您想要已成功删除的文件列表,则可以制作。

还记得要引用你的变量cd并在携带1之前检查退出状态:(cd -P -- "$users_dir" && exec du...)否则du如果失败将在错误的目录中运行cd。另请注意子 shell 的使用,否则如果$users_dir是相对路径,它将无法正常工作。实际上将其写为更有意义:

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

$users_dir(如果是符号链接,则会更加一致)


严格来说,就是至少$DAYSOLD几天前但考虑到比较是使用纳秒精度完成的,并且需要几百纳秒才能开始find,这种区别几乎没有意义。

² 严格来说,ifworkspace是一个非类型的文件目录,它仍然会被传递到find,如果该文件早于$DAYSOLD几天(并且是 的常规文件-type f),它也将被删除。您可以切换到zsh并添加(/)到该模式,以确保仅workspace考虑目录类型的文件。做不是只需附加,/因为您会遇到下面的 ³ 并产生更严重的后果(例如何时是or 的/users/joe/workspace符号链接)。/bin/

³ 请注意,此处后面跟着符号链接。例如,如果/users/joe是符号链接/,则会删除/workspace目录中的旧文件。

答案2

尝试用这个

find $users_dir/user*/workspace -mtime +$DAYSOLD -type f -exec echo rm -v {} \;

如果它达到了你的预期,就会降低回声。如果您想将日期视为从午夜开始,请考虑添加 -daystart

另一种简单的方法是使用 -path

find  $users_dir -path "$users_dir/user*/workspace/*" -mtime +$DAYSOLD -type f -exec echo rm -v {} \;

相关内容