如何删除X天有效但未经过上次修改的文件。它甚至可能吗? Linux的

时间:2016-11-15 20:55:18

标签: linux bash

我在我的linux机器上运行某种服务器,我使用简单的bash脚本每3天删除一次文件,每7天删除一些文件。我使用find命令来执行此操作。但我的文件会定期保存,这意味着最后一个修改日是当天。所以文件永远不会被删除。只是第一次为我工作,因为它符合条件。我找不到使用创建日期而不是修改日期删除这些文件的方法。

这是我的简单剧本:

#!/bin/sh    
while true    
do    
java -server file.jar nogui    
echo ">$(tput setaf 3)STARTING REBOOT$(tput sgr0) $(tput setaf 7)(Ctrl+C To Stop!)$(tput sgr0)"    
find /folder/* -mtime +7 -exec rm -rf {} \;    
find /folder/* -mtime +3 -exec rm -rf {} \;    
find /logs/* -mtime +1 -exec rm -rf {} \;    
echo ">Rebooting in:"    
for i in 5 4 3 2 1    
do    
echo ">$i..."    
sleep 1    
done    
done       

如果有人可以帮助我,我会非常感激!

3 个答案:

答案 0 :(得分:2)

不,这是不可能的。标准Linux文件系统根本不跟踪创建时间。 (ctime,有时会误认为是创建时间,元数据更改时间 - 与mtime相比,即数据修改时间。)

那就是说,肯定有丑陋的黑客可用。例如,如果您有incron(或效率较低,cron)调用以下脚本来记录文件创建日期:

#!/bin/bash
mkdir -p .ctimes
for f in *; do
  if [[ -f $f ]] && [[ ! -e .ctimes/$f ]]; then
    touch ".ctimes/$f"
  fi
done

...然后您可以在.ctimes目录中查找超过三天的文件,并删除它们代表的标记和文件:

#!/bin/bash
find .ctimes -mtime +3 -type f -print0 | while IFS= read -r -d '' filename; do
  realname=${filename#.ctimes/}
  rm -f -- "$filename" "$realname"
done

答案 1 :(得分:2)

只是一个想法 - 不要拍......: - )

如果文件不是由某个进程自动生成的系统文件但是可以说服务器日志文件,则可能在文件内部回显创建日期(即结束或开始)并稍后grep该值以决定是否必须被删除或保留。

答案 2 :(得分:2)

如果您使用的是ext4 Filesystem,那就有希望了。您可以使用statdebugfs实用程序检索它。 ext4使用inode表条目i_crtime存储创建时间,这是'文件创建时间,自纪元以来的秒数。每个文档。参考Link