如何删除超过X小时的文件

时间:2008-10-30 08:31:21

标签: bash

我正在编写一个需要删除旧文件的bash脚本。

目前使用以下方式实施:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

这将删除超过1天的文件。

然而,如果我需要1天更精细的分辨率,比如像6个小时那么?有没有一个很好的干净方法,比如使用find和-mtime?

9 个答案:

答案 0 :(得分:276)

您的find是否拥有-mmin选项?这可以让你测试自上次修改以来的分钟数:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

或者看看使用tmpwatch做同样的工作。 phjr还在评论中推荐了tmpreaper

答案 1 :(得分:8)

你可以这个技巧:1小时前创建一个文件,并使用-newer file参数。

(或使用touch -t创建此类文件。)

答案 2 :(得分:2)

以下是适用于我的方法(我不会在上面使用它)

$ find /path/to/the/folder -name *.* -mmin +59 -delete > /dev/null

删除所有超过59分钟的文件,同时保持文件夹不变。

答案 3 :(得分:1)

对于SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode


 The descriptions of -atime, -ctime, and -mtime use the  ter-
 minology n ``24-hour periods''. For example, a file accessed
 at 23:59 is selected by:


   example% find . -atime -1 -print




 at 00:01 the next day (less than 24 hours  later,  not  more
 than one day ago). The midnight boundary between days has no
 effect on the 24-hour calculation.

答案 4 :(得分:0)

-mmin是几分钟。

尝试查看手册页。

man find

了解更多类型。

答案 5 :(得分:0)

[HttpPost] [ActionName("Login")] public ActionResult Login(LoginViewModel model) { if (ModelState.IsValid) { var user = ctx.Users.Where(x => x.Email == model.Username).FirstOrDefault(); if (user != null) { if (user.PasswordHash == Helpers.PasswordHelper.CreatePasswordHash(model.Password, user.PasswordSalt)) { ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie); identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, model.Username)); List<Claim> claims = new List<Claim>(); var roles = user.UserRoles.Where(x => x.UserId == user.UserId).ToList(); foreach (var item in roles) { claims.Add(new Claim(ClaimTypes.Role, item.Roles.RoleName)); } identity.AddClaims(claims); identity.AddClaim(new Claim(ClaimTypes.Name, model.Username)); AuthenticationManager.SignIn(identity); return RedirectToAction("Index", "Index"); } } ModelState.AddModelError("WrongUsernamePassword", "Wrong username or password!"); return View("Login", model); } else { return View("Login",model); } }

答案 6 :(得分:0)

以下是@iconoclast在他们的comment中对另一个答案感到疑惑的方式所能做的事情。

为用户使用crontab或使用/etc/crontab创建文件/tmp/hour

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

然后使用它来运行命令:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

答案 7 :(得分:0)

如果您的“查找”版本中没有“-mmin”,则“-mtime -0.041667”非常接近“在最后一小时内”,因此在您的情况下,请使用:

-mtime +(X * 0.041667)

所以,如果X表示6小时,那么:

find . -mtime +0.25 -ls

起作用因为24小时* 0.25 = 6小时

答案 8 :(得分:0)

如果一个人的find没有-mmin,并且如果一个人也陷在find中,而该人只接受-mtime的整数值,那么如果人们认为“大于”类似于“不大于”。

如果我们能够创建一个具有截止时间mtime的文件,则可以要求find找到“不比我们的参考文件新”的文件。

创建具有正确时间戳记的文件有点麻烦,因为没有足够find的系统可能还具有功能不足的date命令,之类的东西:date +%Y%m%d%H%M%S -d "6 hours ago"

幸运的是,其他可以管理此问题的旧工具,尽管采用了更为笨拙的方式。

考虑六个小时为21600秒。我们希望以一种有用的格式找到六个小时前的时间:

$ date && perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

perl语句确实产生了一个有用的日期,但是必须更好地使用它:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
  printf "%4d%02d%02d%02d%02d.%02d\n", \
  $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

现在,此旧UNIX的解决方案类似于:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

清理参考文件也可能是个好主意...

$ rm -f ref_file