bash脚本根据文件名中的日期查找旧文件

时间:2011-05-23 16:02:16

标签: bash

我正在开发一个bash脚本,需要根据一个变量搜索单个目录中“旧”的文件,该变量指定在超过阈值之前需要经过的天数以及文件是否标记为操作(可以是从移动到存档到删除等任何事情......)。

问题在于文件的修改时间与确定文件在采取操作之前需要多长时间无关,因为文件可能不经常更改,脚本的执行时间可能会有所不同等等...

确定保存文件的时间是YYYY-MM-DD形式的实际文件名(或带有date命令的%F)。以文件名内容为例 - 2011-05-23.txt。可以在此目录中运行哪些命令来查找超过特定天数的所有文件(我的阈值当前设置为7天,可能会更改)并打印出他们的文件名?

4 个答案:

答案 0 :(得分:5)

像这样创建一个bash脚本isOld.sh:

#!/bin/bash

fileName=$1
numDays=$2

fileDt=$(echo $fileName | sed 's/^[^-]*-\([^.]*\)\..*$/\1/')
d1=$(date '+%s')
d2=$(date -d $fileDt '+%s')
diff=$((d1-d2))
seconds=$((numDays * 24 * 60 * 60))
[[ diff -ge seconds ]] && echo $fileName

然后通过运行:

为上述文件授予执行权限
chmod +x ./isOld.sh

最后从目录顶部运行此find命令以打印超过7天的文件:

find . -name "contents-*" -exec ./isOld.sh {} 7 \;

答案 1 :(得分:2)

在BSD中,-j用于防止设置日期,-f参数用于设置输入日期的格式。 :

首先,你需要在1970年1月1日以来的天数中找到今天的日期:

 today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s)

现在,您可以使用它来查找七天前的时间:

 ((cutoff = $today - 604800))

数字604800是七天内的秒数。

现在,对于目录中的每个文件,您需要找到字符串的日期部分。我不知道更好的方法。 (也许有人知道一些Bash魔法)。

find . -type f | while read fileName
do
     fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/')
     yadda, yadda, yadda #Figure this out later
done

一旦我们有了文件日期,我们就可以使用date命令来确定该日期是否以秒为单位(小于截止日期)

today=$(date -j -f "%Y-%m-%d" 1969-12-31 +%s)
((cutoff = $today - 604800))
find . -type f | while read fileName  #Or however you get all the file names
do
     fileDate=$(echo $foo | sed 's/.*-\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/')
     fileDateInSeconds=$(date -j -f "%Y-%m-%d" $fileDate +%s)
     if [ $fileDateInSeconds -lt $cutoff ]
     then
          rm $fileName
     fi
done

在Linux中,您使用-d参数来定义必须采用YYYY-MM-DD格式的日期:

today=$(date +"%Y-%m-%d)

现在,你可以拿走它并找到秒数:

todayInSeconds=(date -d $today +%s)

其他所有内容应与上述内容大致相同。

答案 2 :(得分:0)

如果您每天运行该命令,则可以执行以下操作:

echo *-`date -d '8 days ago' '+%F'`.txt

可以添加额外的通配符

答案 3 :(得分:0)

find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt -exec bash -c 'dt=`echo $0 | sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; file_time=`date -d $dt +%s`; cutoff_time=`date -d "31 days ago" +%s` ; test $file_time -lt $cutoff_time ' {} \; -print

那是我最长的一个衬里之一:-)这里再次包裹着:

find *[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]*.txt \
  -exec bash -c ' dt=`echo $0 | \
                  sed -re "s/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/"`; \
                  file_time=`date -d $dt +%s`; \
                  cutoff_time=`date -d "31 days ago" +%s` ;\
                  test $file_time -lt $cutoff_time \
                ' {} \; -print