如何删除X小时之前的文件


191

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

目前使用来实现:

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

这将删除早于1天的文件。

但是,如果我需要1天(例如6小时大)的更好分辨率,该怎么办?有没有一种很好的清洁方法,例如使用find和-mtime?

Answers:


303

find-mmin选择吗?这样可以测试自上次修改以来的分钟数:

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

或者,也许考虑使用tmpwatch做相同的工作。phjr还建议tmpreaper在评论中。


2
使用--mmin + X返回所有带有我的查找的文件。我的错是没有先检查这个,但是这个命令只是删除了我的主目录的大部分。对我而言,--mmin -X是正确的参数。
brandones 13-10-16

tmpreapertmpwatch的一个分支。它更安全,并且在发行版中作为debian软件包存在。find -delete的好处:tmpreaper不会删除符号链接,套接字,fifos或特殊文件
Nadir

指出$ REQUIRED_FILES必须用引号引起来(双引号),并且您可以对所有.txt文件使用以“ .txt”为开头的文件,或以“ temp-开头的文件使用以“ temp-开头的文件,以删除所有以temp命名的文件-
achasinh

@PaulDixon如何修改它,以便$LOCATION$REQUIRED_FILES都可以具有多个值,例如dir1 dir2*.txt *.tmp
Enissay

@Enissay $ LOCATION是一个目录。对于多个扩展你可能想要使用-regex模式-见stackoverflow.com/questions/5249779/...
保罗·迪克森

9

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

(或用于touch -t创建这样的文件)。


1
没有-older开关(至少在我的find命令中),这就是需要的。-更新无济于事。
iconoclast

您能否给出一个触摸命令,该命令将生成一个1小时的文件,该文件将在不能使用-mmin的计算机上运行?(如果您使用的是Linux,则-mmin可用,如果没有,则date和其他命令相比也比较微不足道。)
iconoclast

2
@iconoclast touch -t $(date -d '-1 hour' +%Y%m%d%H%M.00) test创建test始终为1小时的文件。
rovr138

4

这是对我有用的方法(我上面没有看到它被使用)

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

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


最好使用单引号,'*.*'否则Shell会将其扩展为实际文件名,而不是将其保留为通配符以find供解析。这中断了find对子目录的递归操作。
MestreLion

也请记住,-name '*.*'不会删除文件没有扩展名,如READMEMakefile
MestreLion

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.


0

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

-mtime +(X * 0.041667)

因此,如果X表示6个小时,则:

find . -mtime +0.25 -ls

之所以起作用是因为24小时* 0.25 = 6小时


之所以抱有希望,是因为这个旧的UNIX没有-mmin,但是可悲的是,这没有帮助,因为这个旧的UNIX还不喜欢mtime的分数值:find:-mtime的参数必须是-2147483647范围内的整数2147483647
kbulgrien

0

这是@iconoclast在他们对另一个答案的评论中所想知道的方法。

使用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 {} \;

*/1因为每小时在您的crontab中是多余的。与在小时字段中输入*相同。
colm.anseo


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.